El gráfico de escena contiene nodos de juego que representan objetos del juego. A primera vista, puede parecer práctico usar Scene Graph como contenedor físico para objetos en el juego, en lugar de std :: vector <> por ejemplo.
Mi pregunta es, ¿ es práctico usar Scene Graph para contener los objetos del juego , o debería usarse solo para definir enlaces de objetos / nodos de escena, mientras se mantienen los objetos almacenados en contenedores separados, como std :: vector <>?
architecture
scene-graph
Bunkai.Satori
fuente
fuente
Respuestas:
Decidir qué tipo de gestión de escena usar depende en gran medida del tipo de lógica que intente ejecutar. Considere los diferentes consumidores de su escena:
Representación del consumidor
El procesador probablemente solo quiera saber qué es visible actualmente para el usuario en cualquier punto dado. Quiere una jerarquía de volumen delimitador para el sacrificio rápido ( artículo de BVH wiki) para que pueda descubrir que no es necesario dibujar una silla dentro de un bote porque los límites del bote están fuera del tronco de la vista. Esto podría estar incrustado en un octree .
También es posible que desee tener una idea de que la silla está boca arriba dentro del bote, y que el bote está rodando hacia arriba y hacia abajo en algunas olas cuando finalmente aparece. De esa manera, para encontrar las coordenadas mundiales finales de los vértices de la silla, puede concatenar la silla y las transformaciones del barco y terminar con esto (esto también facilita su trabajo como programador).
Sin embargo, otra forma de ver este problema es que el procesador probablemente esté ejecutando una buena carta y, en última instancia, solo quiere un montón de triángulos ordenados para minimizar la textura, el sombreador, el material, la iluminación y los cambios de estado de transformación. Esto último probablemente lo ayudará más que un BVH, en cuanto a rendimiento.
Game Logic Consumer
La lógica del juego probablemente solo quiere una lista plana de cosas que pueden comunicarse entre sí mediante un sistema de mensajería, por lo que un std :: vector probablemente esté bien.
El juego también puede querer una forma de hacer un seguimiento de quién está más cerca de qué, por lo que algún tipo de información [vecino más cercano] [3] podría ser útil en ese caso. Esto también puede ser proporcionado por un BVH, pero tener que subir y bajar el gráfico puede ser molesto.
El juego podría incluso querer saber que cuando mueve A, el elemento B de A también debería moverse ... en cuyo caso volvemos a una especie de jerarquía de transformación.
Consumidor de Física
La física del juego puede querer tener una [representación especial] [4] de espacios interiores para una detección de colisión muy rápida. Alternativamente, podría usar algún tipo de octree o [hashing espacial] [5] para encontrar eficientemente cosas que podrían colisionar.
Ninguna de las estructuras de datos de física anteriores se parece realmente a un "gráfico de escena" en el sentido de Java3D.
Consumidor de audio
Un motor de audio solo quiere geometría, quizás un conjunto potencialmente visible (audible), o algún tipo de jerarquía de volumen delimitador para calcular la atenuación y la propagación del sonido. Nuevamente, no es realmente un tipo de gráfico de escena normal, aunque puede ser un gráfico de geometría en su escena.
En última instancia ... ... realmente depende de las necesidades exactas de su aplicación. Para empezar, sugiero usar una lista plana y ver dónde surgen sus problemas. Incluso podría intentar una lista plana con una jerarquía de transformación, porque ese es quizás el único tipo de escena útil por razones distintas a la eficiencia.
¡Buena suerte!
fuente
Hay una buena razón para no usar el gráfico de escena como contenedor de objetos del juego, y eso es una instancia. Si desea reutilizar algunos recursos, tiene mucho más sentido referirse al recurso de su gráfico de escena varias veces que tener varias copias reales.
fuente
Por lo general, es una buena idea separar su modelo de objeto y el modelo de vista (su scenegraph).
Ver este artículo sobre el tema.
Entre muchas cosas, esto permitirá el uso de agrupaciones de objetos. Lo que podría ser esencial para una gestión eficiente de la memoria.
fuente