[Unity] Miles de personas comparten la misma pantalla, desde comenzar hasta darse por vencido: evitación de obstáculos RVO multiproceso

16688842:

¿Se pueden colocar objetos masivos en la misma pantalla sin usar Dots? Muchos juegos con grandes escenas, especialmente los juegos tipo rouge, suelen tener miles de monstruos llenando la pantalla, y el placer de cortar el césped para limpiar la pantalla es sincero. Por lo tanto, estos juegos son muy populares. Pero, ¿cómo lo hacen?

En primer lugar, no es factible utilizar Pathfinding para objetos en movimiento masivos. Incluso un Pathfinding Pro que admite subprocesos múltiples comenzará a perder fotogramas seriamente después de solo entre trescientos y quinientos.

entorno de prueba:

Unidad 2022.3.9f1, URP 14.0.8

El número de vértices del modelo es 1195, el número de vértices LOD1 es 858 y el número de puntos fijos LOD2 es 530.

Ordenador personal: i7-13700KF + 3070 8G;

Móvil Android: Snapdragon 8 gen2;

Prueba de evitación de obstáculos RVO en PC:

 Al probar Unity Editor en PC, el juego casi cayó a 50 cuadros con solo 5000 personas. El difunto emperador colapsó antes de comenzar su negocio. El consumo de rendimiento del lado de la CPU se debe principalmente a la evitación de obstáculos RVO y al cálculo de KDTree para cada cuadro, pero el uso de subprocesos múltiples no es un gran problema, el mayor cuello de botella es la GPU;

PC, 5000 personas:

 En el teléfono móvil, la máquina real Snapdragon 8 gen2 ya no puede manejar a 3.000 personas y se reduce a 24 fotogramas. La actualización en caliente de HybridCLR se utiliza para interpretar y ejecutar, pero incluso AOT solo puede mejorarla entre 5 y 10 fotogramas.

Teléfono celular, 3000 personas:

No hay duda de que Animator no se puede utilizar para la parte de animación. Escribe la información del vértice de cada cuadro de la animación esquelética en la textura y usa Mesh Render + Shader para leer la posición de la textura del vértice en tiempo de ejecución. SRP lo procesará automáticamente por lotes:

Usar LOD:

Bien, la presión está en la GPU, así que bajemos los vértices para enfriar la GPU. Usando la función LOD, cuando los vértices LOD1 se reducen en un 30% y LOD2 en un 60%, el efecto es realmente significativo:

Con 5.000 personas en el lado de la PC, el número de fotogramas casi se duplica a unos 100 fotogramas:

 Hay 3.000 personas en el teléfono móvil, lo que casi se duplica y la velocidad de fotogramas llega a 44:

 ¿Eso es todo? ? ? Y este es el rendimiento sin una lógica de juego compleja, que se reducirá considerablemente en proyectos reales. Parece que utilizando el método tradicional no sólo es complicado que miles de personas compartan pantalla, sino también que miles de personas.

Conclusión: El límite de los métodos tradicionales es el nivel de miles de personas compartiendo pantalla, ¡así que ríndete!

Sin embargo, el RVO todavía es necesario para evitar obstáculos. El proyecto de prueba se modifica según la versión de código abierto RVO2 C#: GitHub - snape/RVO2-CS: Óptima evitación de colisiones recíprocas (C#)

 Se han realizado los siguientes cambios principales en la RVO original:

1. Utilice Easy Threading para actualizar RVO Agent en paralelo;

2. Agregue la función de eliminar Agente;

3. Aumente la configuración del peso para evitar obstáculos del Agente. Por ejemplo, después de establecer el peso del Agente que alcanza la ubicación objetivo en 0, otros Agentes no lo desplazarán;

4. Agregue obstáculos de forma, BoxObstacle, CircleObstacle, EdgeObstacle;

5. Optimización del rendimiento, utilice ArrayPool en lugar de crear matrices en cada cuadro;

6. RVO.Vector2 se cambia a Unity Vector2 y RVO.Math se optimiza para evitar excepciones causadas por el denominador de la versión original como 0.

Versión modificada de RVO2 Unity: GitHub - sunsvip/UnityRVO2: RVO para unity

Supongo que te gusta

Origin blog.csdn.net/final5788/article/details/132891595
Recomendado
Clasificación