Sinceramente, no sé qué motores de próxima generación están utilizando en estos días, pero les diré lo que sí sé. Es fácil confundirse entre una optimización y la estructura de datos utilizada para ayudar en esa optimización. Sin embargo, todas las cosas mencionadas a continuación son para optimizaciones, pero señalaré cuáles son estructuras de datos específicamente.
BSP : Estructura de datos: para detectar la intersección entre los objetos dinámicos en movimiento y la geometría estática del mundo. Solía usarse tanto para la detección de colisiones como para la representación de la geometría correctamente sin un zbuffer, pero ya no se usa para renderizar ya que tenemos suficiente memoria para el búfer az hoy en día. Sin embargo, técnicamente se generan de manera ligeramente diferente, pero aún se consideran el mismo tipo de árbol. Requiere preprocesamiento.
Octree o Kd-Tree : Estructura de datos: se usa para determinar qué objetos están en la misma "celda" o área para evitar hacer una comprobación n ^ 2 en todos los objetos dinámicos.
Estos no son los únicos, pero probablemente sean los más comunes. También hay muchas optimizaciones que permiten que el motor evite renderizar la geometría en general. Pero lo siguiente simplemente elimina la geometría, y eso es generalmente para lo que se usa:
Portales : técnicamente no es una estructura de datos, pero requiere una estructura especial para hacer el sacrificio. Se utiliza para seleccionar la visibilidad de la geometría mundial y la geometría dinámica de los objetos desde la vista. Requiere preprocesamiento para dividir el mundo en áreas, creo. Pero en realidad no he implementado esto, así que no lo sé.
Eliminación de oclusión : optimización: se utiliza para la eliminación de visibilidad para lo que desee, probablemente objetos dinámicos.
Selección regular de Viewport : Optimización: elimina objetos que no están en la vista de la cámara.
Más selección de vistas : Optimización: la selección regular de vistas se puede optimizar aún más mediante el uso de un octree. Puede eliminar celdas enteras del octree que están detrás de la cámara o no a la vista. Esto incluye parches de terreno (si está afuera). Lo que no sea seleccionado por el octree, realizaría un "sacrificio de viewport regular". Entonces, lo que queda, se renderizaría.
Selección posterior : optimización: elimina la geometría de la cámara para evitar la rasterización. Por lo general, se realiza en hardware si el estado de representación está configurado correctamente.
Estructuras de datos de casos especiales:
Árboles AABB o árboles Esfera : son estructuras de datos de casos especiales. Convierten una forma cóncava en una convexa. Por ejemplo, un personaje con huesos es técnicamente cóncavo. Lo divide en pedazos convexos más pequeños. Se puede utilizar como una optimización para la detección de colisiones, la eliminación de visibilidad de objetos dinámicos (por lo general) y facilita la realización de pruebas de intersección ya que es convexo. Estos irían dentro de say, un octree ya que generalmente son objetos dinámicos. Estos también podrían usarse para ayudar con la optimización de la eliminación de oclusiones.
No hay ninguna razón por la que tenga que usar una sola estructura para representar todo (como un gráfico de escena). En mi opinión, sería mejor usar diferentes estructuras de datos para diferentes tareas en lugar de intentar usar un árbol de propósito general de algún tipo. Por ejemplo, en el motor en el que estoy trabajando actualmente, planeo implementar una combinación de árbol BSP / Octree / AABB con las siguientes optimizaciones: eliminación de oclusión, ventana gráfica y, por supuesto, eliminación de superficie posterior. Esto significa que tendré un árbol bsp, un octree y probablemente varios árboles aabb dentro de ese octree.
La selección de las mejores estructuras de datos y algoritmos / optimizaciones es probablemente la cosa más grande y más beneficiosa que puede hacer por su motor.