Desarrollo mi propio motor de juego para divertirme (pero no para obtener ganancias). Tengo renderizado en un hilo y mis actualizaciones de gráficos de escena (velocidad, etc.) en otro. Cuando llega el momento de renderizar, el hilo de renderizado agrega los nodos visibles a un nuevo búfer lineal y los atraviesa.
Más detalladamente, mi gráfico de escena tiene triple búfer. Cada nodo en mi gráfico de escena tiene tres copias de sus matrices de transformación relativas y absolutas (4x4). En cualquier momento, el hilo del gráfico de escena escribe una copia, el renderizador lee una copia y existe una tercera para que el lector o el escritor puedan pasar a la siguiente sin esperar a la otra. Esto evita escribir en algo mientras se está renderizando y generar un gráfico de escena medio actualizado. De alguna manera, también tengo una cuarta copia de cada matriz para que el usuario trabaje con el fin de no entrar en conflicto con el hilo de actualización. Esto parece funcionar bien al evitar tener que sincronizar todo el tiempo.
Sin embargo, esto es un desastre.
Estos son mis objetivos finales para el sistema:
- La representación y la actualización del gráfico de escena permanecen en hilos separados.
- Minimice cuánto deben esperar estos hilos entre sí.
- No renderice una escena que ha sido actualizada a medias por el hilo de actualización. Esto es particularmente notable si la cámara se mueve rápido y, a veces, se procesa antes o después de una actualización.
- Uso reducido de memoria. Tengo demasiadas matrices por nodo. También estoy considerando moverme a vectores para posición / rotación / escala debido al aumento de la deriva de coma flotante con matrices.
- Capacidad para manejar decenas de miles de nodos. El sistema actual hace esto razonablemente bien.
También espero incorporar Bullet (el motor de física) y redes en el futuro, ninguno de los cuales he pensado mucho.
¿Cuáles son algunos enfoques para lograr un mejor gráfico de escena?