Juego multiproceso: actualización, renderizado y cómo dividirlos

8

Desde la publicación StackOverflow (se recomendó mover esto):

Entonces, estoy trabajando en un motor de juego y he progresado bastante bien. Sin embargo, mi motor es de un solo subproceso, y las ventajas de dividir la actualización y el procesamiento en subprocesos separados parecen una muy buena idea.

¿Cómo debería hacer esto? Los motores de juego de un solo subproceso son (conceptualmente) muy fáciles de hacer, tiene un bucle donde actualiza -> render -> sleep -> repetir. Sin embargo, no puedo pensar en una buena manera de separar la actualización y el procesamiento, especialmente si cambio sus velocidades de actualización (digamos que paso por el ciclo de actualización 25 veces por segundo y tengo 60 fps para el procesamiento), ¿qué pasa si empiezo a actualizar a la mitad? a través de un bucle de renderizado, o viceversa?

CodeBunny
fuente

Respuestas:

6

Querrá duplicar / triplicar cualquier búfer de datos necesarios para el procesamiento que se altere en el pase de actualización. De esa manera, no se renderizará con algo que se haya modificado parcialmente. La razón por la que probablemente necesite triplicar el búfer es la necesidad de 1) la copia que está actualizando, 2) la última copia que actualizó por completo y 3) la copia que se está utilizando actualmente para representar que no desea cambiar .

La parte más difícil es encontrar la mejor manera de organizar sus datos para esto.

Roger Perkins
fuente
4

Este sitio web discute el problema y ha implementado una solución de triple buffer como Roger sugirió:

http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part1/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part2/ http: // blog. slapware.eu/game-engine/programming/multithreaded-renderloop-part3/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part4/

Es silencioso, difícil de implementar, pero el sitio web tiene una distribución fuente y binaria de la implementación si está interesado.

Alex de Vries
fuente