Procurando por uma solução mais rápida do que-GDI para renderizar gráficos de dados dinâmicos

StackOverflow https://stackoverflow.com/questions/1074813

Pergunta

Eu escrevi um simples dados baseados em GDI plotter usando C ++ / CLI, mas não é particularmente rápido (alguns perfis básicos indica que é a prestação de tela que é o problema).

Existe alguma maneira para permitir a aceleração de hardware para um UserControl ou há uma interface .NET para Direct3D? ... ou há algumas outras opções que eu poderia considerar.

Estamos usando código gerenciado para que a solução realmente precisa ser CLI compatível, se possível.

[Edit] Em caso de ajuda, eu estou rasgando tiras (128 pontos de dados) de retângulos que são cada 2x2 pixels usando Graphics::FillRectangle -? Talvez haja uma maneira melhor de fazer isso

Foi útil?

Solução

Dirigido DirectX foi substituído por algum tempo. Você realmente não quer usar isso. Em vez disso, você deve usar SlimDX que é uma camada de origem interoperabilidade aberto para as APIs do DirectX SDK escritos em C ++ / CLI. É melhor do que Managed DirectX e é apoiado por uma comunidade de especialistas de desenvolvedores. (Eu vou estar trabalhando para melhorar o apoio DirectWrite com eles em breve.)

Outras dicas

Da minha experiência, você não vai obter um bom desempenho suficiente para fora de usar GDI +. Mesmo para simples desenho, você vai logo perceber que há uma grande quantidade de sobrecarga.

Alternativas iria (como você mencionou) ser Direct3D, ou você poderia considerar normal GDI com chamadas de sistema. Isso, obviamente, faz com que a plataforma de código dependente, mas ele pode ser bastante rápido. Eu tive bons resultados usando isso.

Tudo depende de quanto a complexidade que você está disposto a lidar com eles. GDI pode ser relativamente fácil uma vez que você descobrir o básico, Direct3D é um pouco mais complexa. Embora Direct3D é mais à prova do futuro.

É verdade que GDI + não é muito bom em termos de performance, no entanto eu tenho me escreveu um plotter GDI + em um projeto relacionado ao trabalho que é capaz de cuspir gráficos com milhares de pontos em ~ 30 quadros de pr segundo em resolução de 1680x1050 (scrolling gráfico).

Ele teve um monte de ajuste para alcançar este:

  • converter tudo para um único caminho antes de desenho.
  • Se estiver usando back-tampão, use um com formato de pixel Format32bppPArgb, isso pode acelerar blitting 2-4x.
  • Se desenho de um caminho com uma lote de linhas verticais (sinal de alta frequência), desenhá-los como linhas horizontais sobre uma parte traseira do tampão, em vez, e então desenhar a imagem rodada na tela. Esteja ciente de que desenho uma imagem girada também tem certo custo.

Não consigo ver como o seu cenário requer um monte de otimização, porém, 128 pontos de dados não é nada. Colocando esses pontos em um GraphicsPath poderia fazer uma diferença, porém, desde que significaria menos triagem em cima.

Qual é a resolução e taxa de quadros que estamos falando aqui pelo caminho?

Microsoft agora também tem Direct2D , que é acelerado por hardware 2D desenho:

Direct2D é um-acelerado por hardware, imediato-mode, 2-D gráficos API que proporciona uma elevada performance e prestação de alta qualidade para 2-D geometria, bitmaps e texto. o Direct2D API é projetado para interagir bem com GDI, GDI +, e Direct3D.

Ele requer Windows 7 / Server 2008 R2, mas o suporte foi back-adicionado ao Vista / Server 2008 através do Atualização da Plataforma :

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top