Je développe mon propre moteur de jeu pour le plaisir (mais sans but lucratif). J'ai le rendu dans un thread et mes mises à jour du graphique de scène (vélocité, etc.) dans un autre. Au moment du rendu, le thread de rendu ajoute les nœuds visibles à un nouveau tampon linéaire et les traverse.
Plus en détail, mon graphique de scène est à triple tampon. Chaque nœud de mon graphique de scène a trois copies de ses matrices de transformation relative et absolue (4x4). À tout moment, une copie est écrite par le thread du graphe de scène, une copie est lue par le moteur de rendu et une troisième existe pour que le lecteur ou l'écrivain puisse passer à la suivante sans attendre l'autre. Cela empêche d'écrire sur quelque chose pendant son rendu et de rendre un graphique de scène à moitié mis à jour. D'une certaine manière, j'ai également une quatrième copie de chaque matrice avec laquelle l'utilisateur peut travailler afin de ne pas entrer en conflit avec le fil de mise à jour. Cela semble bien fonctionner en évitant d'avoir à synchroniser tout le temps.
Cependant, c'est un gâchis.
Ce sont mes objectifs ultimes pour le système:
- Le rendu et la mise à jour du graphique de scène restent dans des threads séparés.
- Minimisez combien ces threads doivent s'attendre les uns les autres.
- Ne restituez pas une scène qui a été à moitié mise à jour par le fil de mise à jour. Cela est particulièrement visible si la caméra se déplace rapidement et est parfois rendue avant ou après une mise à jour.
- Utilisation réduite de la mémoire. J'ai beaucoup trop de matrices par nœud. J'envisage également de passer à des vecteurs de position / rotation / échelle en raison de l'augmentation de la dérive du point flottant avec les matrices.
- Capacité à gérer des dizaines de milliers de nœuds. Le système actuel le fait assez bien.
J'espère également intégrer Bullet (le moteur physique) et le réseautage à l'avenir, aucun de ceux auxquels j'ai beaucoup réfléchi.
Quelles sont les approches pour réaliser un meilleur graphique de scène?