Pregunta

Tengo un motor de voxel (básico) que se ejecuta y un sistema de agua que se ve (y asumo básicamente funciona) como este: https://www.youtube.com/watch?v=q_tdegioots (no mi juego).
Los valores de agua se almacenan en una matriz 3D de flotadores, y cada 0.05s calcula el flujo de agua al verificar el voxel debajo y adyacente (Y-1, X-1, X + 1, Z-1, Z + 1) y agrega el valor.
Este sistema funciona bien (70+ FPS) para pequeñas cantidades de agua, pero cuando empiezo a calcular el agua en 8+ trozos, se pone demasiado. (Desactivé toda la creación de representación o de malla para verificar si ese es el cuello de botella, no es. Son puramente los cálculos de flujo).
No soy un programador muy experimentado, así que no sabría dónde comenzar a optimizar, además de hacer que los cálculos sucedan en una coroutina como ya lo hice.
En esta publicación: https://gedev.stackexchange.com/questions/ 55414 / Cómo definir las áreas de definición: Llenaron en agua (cerca del fondo) Boreal sugiere ejecutarlo en un sombreador de cómputo . ¿Es este la forma de irme por mí? ¿Y cómo voy a hacer tal cosa?
Cualquier ayuda es muy apreciada.

¿Fue útil?

Solución

Si realmente está calculando una simulación basada en voxel, ampliará el número de cálculos geométricamente a medida que aumenta su tamaño, por lo que se quedará sin poder de procesamiento rápidamente en volúmenes más grandes.

Un shader de cómputo es ideal para hacer cálculos masivamente paralelos rápidamente, aunque es un paradigma de programación muy diferente que lleva a la hora de acostumbrarse. Un sombreador de cómputo analizará el contenido de un búfer (es decir, una "textura" para los civiles de los EE. UU.) Y hacer cosas muy rápidamente, en su caso, el búfer probablemente será un tampón / textura cuyos valores de píxeles representen células de agua. Si desea hacer algo realmente sencillo, ya que los incremento hacia arriba o hacia abajo, el sombreador de cómputo usa la potencia de procesamiento paralelo de la GPU para hacerlo realmente rápido.

La parte difícil es que las GPU son Optimizado para el procesamiento paralelo . Esto significa que no puede escribir código como "texela.value += texelb.value", sin trabajo adicional de su parte, cada fragmento del búfer se procesa con cero conocimiento de lo que sucede en los otros fragmentos. Para hacer referencia a otros texeles, debe leer la textura de alguna manera, algunas técnicas leen una textura varias veces con compensaciones ( Este ejemplo de GL hace esto para implementar Blurs, otros lo hacen procesando repetidamente una textura, poniendo el resultado en una textura temporal y luego reprocesando eso.

En el nivel de 10,000 pies: Sí, un shader de cómputo es una buena herramienta para este tipo de problema, ya que involucra toneladas de cálculo auto-similar. Pero, no será fácil dejar el bate. Si no ha realizado antes de la programación de sombreado convencional, es posible que desee ver que primero se acostumbre a la forma en que funciona GPUS. Incluso las herramientas realmente básicas (si entonces, entonces, o los bucles) tienen implicaciones y usos muy diferentes de rendimiento en la programación de la GPU y se tarda un tiempo en obtener la cabeza alrededor de las diferencias. A partir de esta escritura (1/10/13) se parece a NVIDIA y Udacity están ofreciendo una introducción para computar Curso de sombreado que podría ser una buena manera de ponerse al día.

FWIW También necesita un hardware bastante moderno para los sombreadores de cómputo, lo que puede limitar a su audiencia.

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