Contexte
J'ai travaillé sur la création d'un moteur de jeu multithread pendant mon temps libre et j'essaie actuellement de décider de la meilleure façon d'intégrer un système d'entité dans ce que j'ai déjà créé. Jusqu'à présent, j'ai utilisé cet article d'Intel comme point de départ pour mon moteur. Jusqu'à présent, j'ai implémenté la boucle de jeu normale à l'aide de tâches, et je passe maintenant à l'intégration de certains systèmes et / ou systèmes d'entité. J'ai utilisé quelque chose de similaire à Artemis dans le passé, mais le parallélisme me déstabilise.
L'article d'Intel semble préconiser la possession de plusieurs copies des données d'entité et la modification interne de chaque entité à la fin d'une mise à jour complète. Cela signifie que le rendu sera toujours une image derrière, mais cela semble être un compromis acceptable compte tenu des avantages de performances qui devraient être obtenus. En ce qui concerne un système d'entités comme Artemis, cependant, la duplication de chaque entité pour chaque système signifie que chaque composant devra également être dupliqué. C'est faisable, mais il me semble que cela consommerait beaucoup de mémoire. Les parties du document Intel qui en discutent sont principalement 2.2 et 3.2.2. J'ai fait quelques recherches pour voir si je pouvais trouver de bonnes références pour intégrer les architectures que je cherchais, mais je n'ai pas encore pu trouver quoi que ce soit d'utile.
Remarque: J'utilise C ++ 11 pour ce projet, mais j'imagine que la plupart de ce que je demande devrait être assez indépendant du langage.
Solution possible
Avoir un EntityManager global qui est utilisé pour créer et gérer des Entités et EntityAttributes. Autorisez leur accès en lecture uniquement pendant la phase de mise à jour et stockez toutes les modifications dans une file d'attente par thread. Une fois toutes les tâches terminées, les files d'attente sont combinées et les modifications de chacune sont appliquées. Cela pourrait avoir des problèmes avec plusieurs écritures dans les mêmes champs, mais je suis sûr qu'il pourrait y avoir un système prioritaire ou un horodatage pour trier cela. Cela me semble être une bonne approche car les systèmes peuvent être notifiés des changements aux entités assez naturellement pendant la phase de distribution des changements.
Question
Je recherche des commentaires sur ma solution pour voir si elle a du sens. Je ne mentirai pas et ne prétendrai pas être un expert du multithreading, et je le fais en grande partie pour la pratique. Je peux prévoir des désordres compliqués découlant de ma solution où plusieurs systèmes lisent / écrivent plusieurs valeurs. La file d'attente de modifications que j'ai mentionnée peut également être difficile à formater de manière à ce que tout changement possible puisse être facilement communiqué lorsque je ne travaille pas avec POD.
Tout commentaire / conseil serait très apprécié! Merci!
Liens
- 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/ (non mentionné dans cet article mais solution similaire mentionnée)