Pergunta

Existe outra maneira de renderizar gráficos em C# além GDI+ e XNA?

(Para o desenvolvimento de um editor de mapas lado a lado.)

Foi útil?

Solução

SDL.NET é a solução que aprendi a amar.Se precisar de 3D em cima dele, você pode usar Tao.OpenGL para renderizar dentro dele.É rápido, padrão da indústria (SDL, isto é) e plataforma cruzada.

Outras dicas

Sim, escrevi um controle Windows Forms que envolve o DirectX 9.0 e fornece manipulação direta no nível de pixel da superfície do vídeo.

Na verdade, escrevi outro post no Stack Overflow perguntando se existem outras abordagens melhores: C# inseguro e ponteiros para renderização 2D, bons ou ruins?

Embora tenha um desempenho relativamente alto, requer a opção insegura do compilador, pois usa ponteiros para acessar a memória com eficiência.Daí o motivo deste post anterior.

Este é um alto nível das etapas necessárias:

  1. Baixe o SDK do DirectX.
  2. Crie um novo C# Formulários do Windows projete e faça referência ao conjunto instalado do Microsoft DirectX.
  3. Inicialize um novo objeto de dispositivo DirectX com parâmetros de apresentação (janela, buffer traseiro, etc.) que você precisa.
  4. Crie o dispositivo, tomando cuidado para gravar o modo de exibição "pitch" da superfície e atual (bits por pixel).
  5. Quando você precisa exibir algo, Lock A superfície do backbuffer e armazene o ponteiro retornado para o início da memória da superfície.
  6. Use aritmético do ponteiro, calcule a posição real de pixel nos dados com base no passo da superfície, bits por pixel e a coordenada real de x/y pixel.
  7. No meu caso, para simplificar, optei por 32 bpp, o que significa que definir um pixel é tão simples quanto:*(surfacePointer + (y * pitch + x))=Color.FromARGB(255,0,0);
  8. Ao terminar de desenhar, Unlock a superfície do buffer traseiro.Apresente a superfície.
  9. Repita a partir do passo 5 conforme necessário.

Esteja ciente de que, ao adotar essa abordagem, você precisa ter muito cuidado ao verificar o modo de exibição atual (pitch e bits por pixel) da superfície alvo.Além disso, você precisará ter uma estratégia para lidar com o redimensionamento de janelas ou alterações no formato da tela enquanto o programa estiver em execução.

  • DirectX gerenciado (namespace Microsoft.DirectX) para gráficos 3D mais rápidos.É um wrapper .NET sólido sobre a API DirectX, que vem com um pouco de impacto no desempenho para a criação de objetos .NET e empacotamento.A menos que você esteja escrevendo um mecanismo 3D moderno e completo, ele funcionará bem.

  • Window Presentation Foundation (WPF) (namespace Windows.Media) - melhor escolha para gráficos 2D.Também possui habilidades 3D limitadas.Destina-se a substituir o Windows Forms por uma estrutura independente de resolução acelerada por hardware e vetorial.Muito conveniente, suporta vários tipos de controles personalizados, recursos, vinculação de dados, eventos e comandos...também tem alguns WTFs.A velocidade geralmente é mais rápida que o GDI e mais lenta que o DirectX, e depende muito de como você faz as coisas (vi algo funcionar 60 vezes mais rápido depois de reescrever de maneira sensata).Tivemos sucesso na implementação de 3 telas de 1280x1024 cheias de indicadores, gráficos e plotagens em tempo real em um único (e não o melhor) PC.

Você poderia tentar pesquisar no WPF, usando Visual Studio e/ou Expression Blend.Não tenho certeza de quão sofisticado você está tentando ser, mas deve ser capaz de lidar com um editor simples.Veja isso Artigo MSDN para mais informações.

Você pode olhar para o Biblioteca gráfica do Cairo.O Mono projeto tem ligações para C#.

Cairo é uma opção.Atualmente estou reescrevendo meu software de mapeamento usando GDI+ e Cairo.Possui gerador de mapas de blocos, entre outras funcionalidades.

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