Así que estoy haciendo un desarrollo de DirectX, usando SharpDX bajo .NET para ser exactos (pero las soluciones API de DirectX / C ++ son aplicables). Estoy buscando la forma más rápida de representar líneas en una proyección ortogonal (por ejemplo, simulando un dibujo lineal 2D para aplicaciones científicas) usando DirectX.
A continuación se muestra una captura de pantalla de los tipos de parcelas que intento representar:
No es raro que este tipo de parcelas tengan líneas con millones de segmentos, de espesor variable, con o sin antialiasing por línea (o pantalla completa AA activada / desactivada). Necesito actualizar los vértices de las líneas con mucha frecuencia (por ejemplo, 20 veces / segundo) y descargar la mayor cantidad posible a la GPU.
Hasta ahora he intentado:
- La representación de software, por ejemplo, GDI + en realidad no es un mal rendimiento, pero obviamente es pesado en la CPU
- Direct2D API: más lento que GDI, especialmente con Antialiasing en
- Direct3D10 usando este método para emular AA usando colores de vértice y teselación en el lado de la CPU. También lento (lo perfilé y se pasa el 80% del tiempo calculando las posiciones de los vértices)
Para el tercer método, estoy usando Vertex Buffers para enviar una franja triangular a la GPU y actualizar cada 200 ms con nuevos vértices. Estoy obteniendo una frecuencia de actualización de alrededor de 5FPS para 100,000 segmentos de línea. ¡Necesito millones idealmente!
Ahora estoy pensando que la forma más rápida sería hacer la teselación en la GPU, por ejemplo, en un sombreador de geometría. Podría enviar los vértices como una lista de líneas o empaquetar en una textura y desempaquetar en un sombreador de geometría para crear los quads. O simplemente envíe puntos sin procesar a un sombreador de píxeles e implemente el dibujo lineal de Bresenham completamente en un sombreador de píxeles. Mi HLSL es un modelo oxidado y sombreado 2 de 2006, así que no sé qué cosas locas pueden hacer las GPU modernas.
Entonces la pregunta es: ¿Alguien ha hecho esto antes y tiene alguna sugerencia que probar? - ¿Tiene alguna sugerencia para mejorar el rendimiento actualizando rápidamente la geometría (por ejemplo, una nueva lista de vértices cada 20 ms)?
ACTUALIZACIÓN 21 de enero
Desde entonces he implementado el método (3) anterior usando sombreadores Geometry usando LineStrip y Dynamic Vertex Buffers. Ahora obtengo 100FPS en 100k puntos y 10FPS en 1,000,000 puntos. Esta es una gran mejora, pero ahora tengo una tasa de relleno y un cálculo limitados, así que pensé en otras técnicas / ideas.
- ¿Qué pasa con la instalación de hardware de una geometría de segmento de línea?
- ¿Qué pasa con Sprite Batch?
- ¿Qué pasa con otros métodos orientados (sombreador de píxeles)?
- ¿Puedo sacrificar eficientemente la GPU o la CPU?
Sus comentarios y sugerencias son muy apreciados!