Pregunta

Estoy escribiendo un control C# que incluye DirectX 9 y proporciona una interfaz simplificada para realizar dibujos a nivel de píxeles 2D..NET requiere que incluya este código en un bloque de código inseguro y lo compile con la opción permitir código inseguro.

Estoy bloqueando toda la superficie que luego devuelve un puntero al área de memoria bloqueada.Luego puedo escribir datos de píxeles directamente usando aritmética de punteros "simple".Probé el rendimiento de esto y encontré una mejora sustancial de la velocidad con respecto a otros métodos "seguros" que conozco.

¿Es esta la forma más rápida de manipular píxeles individuales en una aplicación C# .NET?¿Existe una manera mejor y más segura?Si hubiera un enfoque igualmente rápido que no requiera manipulación del puntero, preferiría usarlo.

(Sé que estamos en 2008 y todos deberíamos usar DirectX 3D, OpenGL, etc., sin embargo, este control debe usarse exclusivamente para la representación de píxeles 2D y simplemente no requiere representación 3D).

¿Fue útil?

Solución

El uso de punteros inseguros es la forma más rápida de realizar manipulación directa de la memoria en C# (definitivamente más rápido que usar las funciones contenedoras de Marshal).

Solo por curiosidad, ¿qué tipo de operaciones de dibujo 2D estás intentando realizar?

Lo pregunto porque bloquear una superficie DirectX para realizar manipulaciones a nivel de píxeles anulará la mayoría de los beneficios de aceleración de hardware que esperaría obtener al usar DirectX.Además, el dispositivo DirectX no podrá inicializarse cuando se utilice a través de servicios de terminal (escritorio remoto), por lo que el control no podrá utilizarse en ese escenario (es posible que esto no le importe).

DirectX será una gran ventaja al dibujar triángulos grandes y transformar imágenes (textura asignada a un quad), pero en realidad no funcionará tan bien con la manipulación de un solo píxel.

Permaneciendo en el terreno .NET, una alternativa es mantener un objeto Bitmap para que actúe como superficie, usando LockBits y accediendo directamente a los píxeles a través del puntero inseguro en el objeto BitmapData devuelto.

Otros consejos

Sí, esa es probablemente la forma más rápida.

Hace unos años tuve que comparar dos imágenes de 1024x1024 a nivel de píxeles;los métodos de obtención de píxeles tardaron 2 minutos y el escaneo inseguro tardó 0,01 segundos.

También he usado unsafe para acelerar cosas de esa naturaleza.Las mejoras de rendimiento son espectaculares, por decir lo menos.El punto aquí es que inseguro desactiva un montón de cosas que quizás no necesites siempre que sepas lo que estás haciendo.

Además, echa un vistazo sorteo directo.Es el componente de gráficos 2D de DirectX.Es realmente rápido.

Recientemente se me asignó la tarea de crear un control de histograma simple para una de nuestras aplicaciones de cliente ligero (C#).Las imágenes que estaba analizando eran de aproximadamente 1200x1200 y tuve que seguir el mismo camino.Podría hacer que la cosa se dibujara sola una vez sin problemas, pero el control debía poder cambiar de tamaño.Intenté evitarlo, pero tenía que llegar al recuerdo en bruto.

No estoy diciendo que sea imposible usar las clases .NET estándar, pero al final no pude hacerlo funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top