Pergunta

Eu estou escrevendo um C# de controle que envolve o DirectX 9 e fornece uma interface simplificada para executar 2D nível de pixel de desenho..NET requer que eu quebrar este código não seguro bloco de código e compilar com a opção de permitir inseguro código de opção.

Eu sou o bloqueio de toda a superfície, em seguida, retorna um ponteiro para a área bloqueada de memória.Eu, em seguida, pode escrever dados de pixel diretamente usando "simples" aritmética do ponteiro.Eu tenho o desempenho testado isso e encontrou uma substancial melhoria de velocidade sobre os outros "safe" os métodos que eu conheço.

Esta é a maneira mais rápida para manipular os pixels individuais em C# .NET aplicação?Existe um melhor e mais segura maneira?Se houve igualmente uma abordagem rápida que não requer a manipulação de ponteiro que seria a minha preferência para usar isso.

(Eu sei que isso é 2008 e que todos nós deveríamos estar usando o DirectX 3D, OpenGL, etc., no entanto, esse controle é para ser usado exclusivamente para 2D pixel de renderização e simplesmente não necessitam de renderização 3D.)

Foi útil?

Solução

Usando inseguro ponteiros é a maneira mais rápida de fazer direto manipulação de memória em C# (definitivamente mais rápido do que usando o Marechal funções de wrapper).

Só por curiosidade, que tipo de desenho 2D operações você está tentando realizar?

Eu pergunto porque o bloqueio de uma superfície de DirectX para fazer pixel nível de manipulações vai derrotar a maioria do hardware de aceleração de benefícios que você espera ganhar com DirectX.Além disso, o DirectX dispositivo irá falhar para inicializar quando usada ao longo de serviços de terminal (remote desktop), para que o controle será inutilizável em que cenário (talvez isso não importa para você).

DirectX vai ser um grande ganho de desenho grande de triângulos e transformar imagens (textura mapeada para um quad), mas ele realmente não vai realizar essa grande com um único pixel de manipulação.

Ficar em .NET terra, uma alternativa é manter em torno de um objecto de mapa de bits para funcionar como a sua superfície, usando LockBits e acessar diretamente os pixels meio inseguro ponteiro no devolvidos objeto BitmapData.

Outras dicas

Sim, essa é provavelmente a maneira mais rápida.

Alguns anos atrás eu tinha para comparar dois 1024x1024 imagens no nível de pixel;o get-pixel métodos levou 2 minutos, e não seguro de digitalização levou 0,01 segundos.

Eu também tenho usado inseguro para acelerar as coisas da natureza.As melhorias de desempenho são dramáticos, para dizer o mínimo.O ponto aqui é que não seguros desliga um monte de coisas que você talvez não precise desde que você saiba o que está fazendo.

Confira também DirectDraw.É a gráficos 2D componente do DirectX.Ele é realmente rápido.

Recentemente, foi encarregado de criar um simples histograma de controle para um de nossos cliente fino apps (C#).As imagens que eu estava analisando foram cerca de 1200x1200 e eu tinha que ir para o mesmo caminho.Eu poderia fazer a coisa sorteio de uma vez com nenhum problema, mas o controle necessário para voltar a ser considerável.Eu tentei evitar, mas eu tinha que pegar em matérias de memória em si.

Eu não estou dizendo que é impossível utilizar o padrão .NET aulas, mas eu não poderia obtê-lo com muito trabalho no final.

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