Graphique de scène dans un thread séparé

12

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?

EricP
la source

Réponses:

4

Avez-vous lu la thèse de Johannes Spohr sur "Pace" et son moteur de rendu? Il décrit un soi-disant «moteur de soumission» * moteur de rendu parallèle, et peut vous donner quelques idées.

Voici la page de résumé (en allemand), et voici un lien direct vers le PDF qui est en anglais.

( *: ce lien renvoie également à l'article où j'ai initialement entendu parler de la thèse.)

EDIT: Je l'avais seulement survolé auparavant, et je l'ai juste regardé à nouveau ... et j'ai réalisé qu'il masquait vraiment les détails du graphique de la scène. Je suppose que je ne savais pas à quel point sa conception était orthogonale. Désolé si ce n'est pas particulièrement utile.

Neverender
la source
1
Un morceau de ce document m'est resté: "Idéalement, l'application ne saurait même pas qu'il existe un graphique de scène, elle ne devrait connaître qu'un composant de vue qu'elle doit informer des modifications du modèle de données". Cela m'a inspiré une nouvelle façon de voir les choses: je n'ai pas besoin de tripler la mémoire tampon de la scène entière, seulement ce qui est visible à travers la caméra actuelle. Je peux déplacer l'abattage du fil de rendu vers le fil du graphique de scène (lorsqu'il rencontre une caméra), et à tout moment, l'un de ces trois tampons peut être écrit par lui, et un autre lu par le moteur de rendu.
EricP
1
Vous pouvez également consulter l'article "Conception de moteur centré sur la caméra pour le rendu multithread" dans Game Engine Gems 1, ainsi que le "Rendu parallèle pratique avec DirectX 9 et DirectX 10" - microsoft.com/downloads/en/…
Neverender
1
On dirait que Game Engine Gems 1 est disponible gratuitement en ligne: books.google.com/…
EricP