Antecedentes
He estado trabajando en la creación de un motor de juegos multiproceso en mi tiempo libre y actualmente estoy tratando de decidir la mejor manera de trabajar un sistema de entidades en lo que ya he creado. Hasta ahora, he usado este artículo de Intel como punto de partida para mi motor. Hasta ahora, he implementado el ciclo de juego normal usando tareas, y ahora estoy avanzando para incorporar algunos de los sistemas y / o sistemas de entidades. He usado algo similar a Artemis en el pasado, pero el paralelismo me está desanimando.
El artículo de Intel parece abogar por tener múltiples copias de los datos de la entidad, y que se realicen cambios a cada entidad que se distribuye internamente al final de una actualización completa. Esto significa que el renderizado siempre estará un fotograma atrás, pero parece un compromiso aceptable dados los beneficios de rendimiento que se deben obtener. Sin embargo, cuando se trata de un sistema de entidades como Artemis, tener cada entidad duplicada para cada sistema significa que cada componente también necesitará duplicarse. Esto es factible, pero para mí parece que usaría mucha memoria. Las partes del documento de Intel que discuten esto son 2.2 y 3.2.2 principalmente. He buscado un poco para ver si puedo encontrar buenas referencias para integrar las arquitecturas que busco, pero aún no he podido encontrar nada útil.
Nota: Estoy usando C ++ 11 para este proyecto, pero imagino que la mayoría de lo que pido debería ser bastante independiente del lenguaje.
Solución posible
Tenga un EntityManager global que se use para crear y administrar Entidades y Atributos de Entidad. Permita el acceso de lectura a ellos solo durante la fase de actualización y almacene todos los cambios en una cola por hilo. Una vez que se completan todas las tareas, las colas se combinan y se aplican los cambios en cada una. Esto podría tener problemas con múltiples escrituras en los mismos campos, pero estoy seguro de que podría haber un sistema de prioridad o marca de tiempo para solucionarlo. Esto parece un buen enfoque para mí porque los sistemas pueden ser notificados de los cambios en las entidades de forma bastante natural durante la etapa de distribución de cambios.
Pregunta
Estoy buscando comentarios sobre mi solución para ver si tiene sentido. No mentiré y afirmaré que soy un experto en subprocesos múltiples, y lo estoy haciendo en gran medida por práctica. Puedo prever algunos problemas complicados que surgen de mi solución en la que múltiples sistemas leen / escriben múltiples valores. La cola de cambios que mencioné también podría ser difícil de formatear de manera que cualquier cambio posible pudiera comunicarse fácilmente cuando no estoy trabajando con POD.
Cualquier comentario / consejo sería muy apreciado! ¡Gracias!
Enlaces
- http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine
- http://gamadu.com/artemis/
- http://www.gamedev.net/topic/560083-rendering-in-a-task-based-multithreaded-environment/ (no se menciona en esta publicación pero se menciona una solución similar)