Le graphe de scène contient des nœuds de jeu représentant des objets de jeu. À première vue, il peut sembler pratique d'utiliser Scene Graph comme conteneur physique pour les objets du jeu, au lieu de std :: vector <> par exemple.
Ma question est, est-il pratique d'utiliser le graphe de scène pour contenir les objets du jeu , ou doit-il être utilisé uniquement pour définir les liens entre les objets et les nœuds de la scène, tout en conservant les objets stockés dans un conteneur séparé, comme std :: vector <>?
architecture
scene-graph
Bunkai.Satori
la source
la source
Réponses:
Le choix du type de gestion de scène à utiliser dépend fortement du type de logique que vous essayez d'exécuter. Considérez les différents consommateurs de votre scène:
Consommateur de rendu
Le moteur de rendu veut probablement simplement savoir ce qui est actuellement visible par l'utilisateur à un moment donné. Il veut une hiérarchie de volume de délimitation pour une élimination rapide ( article wiki BVH) afin de pouvoir comprendre qu'une chaise à l'intérieur d'un bateau n'a pas besoin d'être dessinée car les limites du bateau sont en dehors du tronc de vue. Cela pourrait être intégré dans un octree .
Il pourrait également vouloir avoir une idée que la chaise est sur le dos à l'intérieur du bateau, et que le bateau roule de haut en bas sur certaines vagues quand il apparaît enfin. De cette façon, pour trouver les coordonnées mondiales finales des sommets de la chaise, il peut concaténer les transformations de chaise et de bateau et en finir (cela rend également votre travail de programmeur plus facile).
Encore une autre façon de voir ce problème est que le moteur de rendu exécute probablement une bonne carte et, en fin de compte, veut juste un tas de triangles triés de manière à minimiser la texture, le shader, le matériau, l'éclairage et les changements d'état de transformation. Ce dernier vous aidera probablement plus qu'un BVH, en termes de performances.
Game Logic Consumer
La logique du jeu veut probablement juste une liste plate de choses qui peuvent se parler par un système de messagerie, donc un std :: vector est probablement bien.
Le jeu pourrait également vouloir un moyen de garder une trace de qui est le plus proche de quoi, donc une sorte d'information [du plus proche voisin] [3] pourrait être utile dans ce cas. Cela peut également être fourni par un BVH, mais avoir à monter et descendre le graphique peut être ennuyeux.
Le jeu voudra peut-être même simplement savoir que quand il bouge A, l'élément B de A devrait aussi bouger ... auquel cas nous revenons à une sorte de hiérarchie de transformation.
Consommateur de physique
Votre physique de jeu peut vouloir avoir une [représentation spéciale] [4] d'espaces intérieurs pour une détection très rapide des collisions. Alternativement, il pourrait utiliser une sorte d'octree ou de [hachage spatial] [5] pour trouver efficacement les choses qui pourraient entrer en collision.
Aucune des structures de données physiques ci-dessus ne ressemble vraiment à un "graphique de scène" au sens de Java3D.
Consommateur audio
Un moteur audio veut juste de la géométrie, peut-être un ensemble potentiellement visible (audible), ou une sorte de hiérarchie de volume englobante pour calculer l'atténuation sonore et la propagation. Encore une fois, ce n'est pas vraiment un type de graphique de scène normal, bien qu'il puisse s'agir d'un graphique de géométrie dans votre scène.
En fin de compte ... ... cela dépend vraiment des besoins exacts de votre application. Je suggère d'utiliser une liste plate pour commencer et de voir où se posent vos problèmes. Vous pourriez même essayer une liste plate avec une hiérarchie de transformation, car c'est peut-être la seule sorte de scénario utile pour des raisons autres que l'efficacité.
Bonne chance!
la source
Il y a une bonne raison de ne pas utiliser le graphique de scène comme conteneur pour les objets de jeu, et c'est l'instanciation. Si vous souhaitez réutiliser certaines ressources, il est beaucoup plus logique de se référer plusieurs fois à la ressource de votre graphique de scène que d'avoir plusieurs copies réelles.
la source
Séparer votre modèle d'objet et votre modèle de vue (votre scénario) est généralement une bonne idée.
Voir cet article sur le sujet.
Cela permettra notamment l'utilisation de pools d'objets. Ce qui pourrait être essentiel pour une gestion efficace de la mémoire.
la source