El lote de Unity falló

Reimpreso:  https://zhuanlan.zhihu.com/p/109200416

3 Cuando el framedebuger observe los resultados, preste atención principalmente a Shadows.RenderJobDir y RenderForward.RenderLoopJob en Shadows.RenderShadowMap. Se puede ver que el procesamiento por lotes se implementa principalmente en estas dos funciones, a saber, dibujar sombras y dibujar entidades. Es posible que algunos ajustes se hayan combinado en una función pero hayan fallado en otra función.

Mallas combinadas diferentes : el objeto pertenece a otra malla estática combinada

En el editor, el procesamiento por lotes estático construirá un CombineMesh en tiempo de ejecución después de verificar estático en GO , y cuando se abre el paquete de instalación, CombineMesh se construirá durante el empaquetado. Pero en el juego en ejecución, GO sin estática comprobada también puede generar CombineMesh

StaticBatchingUtility.Combine(gameObject);

La malla de los objetos secundarios de gameObject generará un CombineMesh independiente. No se pueden agrupar dos CombineMesh diferentes

Propiedades personalizadas diferentes : el objeto tiene un conjunto MaterialProperyBlock diferente

Cuando desee cambiar muchos objetos con un material común, puede cambiar directamente las propiedades del material, como

material.SetColor(name,value)

Pero esto instanciará una gran cantidad de InstanceMat (Instance) en la memoria.

Use MaterialProperyBlock, no se generará en la memoria

MaterialPropertyBlock mpb = new MaterialPropertyBlock();
for (int i = 0; i < MeshRenderers.Length; i++)
{
	mpb.SetColor("_Color", Colors[i]);
	MeshRenderers[i].SetPropertyBlock(mpb);
}

Pero esto no se incluirá en el momento de la presentación. Tenga en cuenta que el material aquí no es Habilitar instancia de GPU

luces diferentes : el objeto se ve afectado por una luz delantera diferente

Hay varias fuentes de luz en una escena y cada fuente de luz ilumina objetos de diferentes niveles. Las luces dividen estos objetos en diferentes tipos. Luego hay tantos CD como tipos de objetos. Tenga en cuenta que no es que un objeto esté iluminado por múltiples fuentes de luz. Si un objeto está iluminado por múltiples fuentes de luz, habrá una advertencia de Múltiples luces delanteras, que se mencionarán a continuación.

materiales diferentes : el objeto tiene un material diferente

Diferentes materiales

Hash de lanzador de sombras diferente: los objetos tienen diferentes sombreadores de lanzador de sombras o tienen diferentes propiedades de sombreador / palabras clave que afectan la salida del pase de lanzador de sombras

Se utilizan diferentes sombreadores de proyección de sombras; o los parámetros del mismo sombreador son diferentes, estos parámetros afectarán la salida del pase de proyección de sombras

diferentes configuraciones de recepción de sombras : los objetos tienen diferentes configuraciones de "recepción de sombras", o algunos objetos están dentro de la distancia de sombra, mientras que otros objetos no lo están

La configuración de la sombra de recepción es diferente

banderas de lotes estáticos diferentes : el objeto tiene diferentes configuraciones de lotes estáticos

La estática no está marcada. Aquí encontré una situación en la que creé dos cubos para un nuevo proyecto, uno marcado como estático y el otro sin marcar, que es un procesamiento por lotes dinámico. Cree tres cubos, dos de verificación estática y una solicitud de desmarque se debe a una configuración de procesamiento por lotes estática diferente.

Agrupación dinámica deshabilitada para evitar la lucha Z : la agrupación dinámica por lotes está desactivada en la configuración del jugador o se deshabilita temporalmente en el contexto actual para evitar la lucha contra la z

Desactívelo temporalmente en el entorno actual, puede ajustar RenderingPath de la cámara. No lo he encontrado específicamente. .

Instancia de diferentes geometrías : renderización de diferentes mallas o submallas con instancias de GPU

Usé el material con Habilitar instalación de GPU activada y usé una malla diferente. Cuando se activa la creación de instancias para el material del objeto, se juzgará si el índice de submalla del primer nodo en la lista de lotes es igual al índice de la submalla del objeto cuando se procesa por lotes. Si son iguales, se puede procesar la creación de instancias.

10  objetos de mapa de luz: el objeto usa un mapa de luz diferente o tiene diferentes transformaciones de mapa de luz uv dentro del mismo mapa de luz

Se utiliza el mapa de luz de índice diferente, o el uv del mapa de luz es diferente. Mi (pocas) experiencia aquí es que si dos objetos participan en el horneado del mapa de luz al mismo tiempo, entonces no se pueden agrupar. Mi experimento es copiar un objeto. En este momento, la configuración de Transformación de los dos objetos Luego participe en el horneado, y finalmente el desplazamiento de los dos objetos en el mapa de luz sigue siendo diferente, y el procesamiento por lotes no está implementado.

11 lanzadores de sombras de modo mixto : los objetos tienen diferentes configuraciones de "Proyección de sombras"

Castshadow establece uno para elegir TwoSided y el otro es diferente. Cuando dos objetos proyectan sombras, proyectarán dos lados y el otro no lo hará y no se unirá por lotes.

12  Multipass : el objeto está usando un sombreador de múltiples pasadas

Se utiliza un sombreador con varias pasadas. Un sombreador con varias pasadas se dibujará varias veces, y varios objetos con varias pasadas aumentarán los lotes exponencialmente. Porque es necesario asegurarse de que todos los cálculos se realicen en la cpu o gpu al procesar diferentes pases para asegurar la precisión de los datos.

13  múltiples luces delanteras : el objeto se ve afectado por varias luces delanteras

Si un objeto está iluminado por múltiples fuentes de luz, algunas fuentes de luz tendrán varios CD. En FrameDebuger, se le indicará que no se puede agrupar con el Nodo anterior porque este objeto se ve afectado por múltiples luces de avance.

14  Conjunto de propiedades no instanciables

Establezca el atributo no instanciable en el material de Habilitar instancia de GPU

MaterialPropertyBlock mpb = new MaterialPropertyBlock();
for (int i = 0; i < meshRenderers.Length; ++i)
{
	mpb.SetColor("_Color", colors[i]);		// instanceable
	mpb.SetFloat("_Metallic", 1.0f);		// not instanceable
	meshRenderers[i].SetPropertyBlock(mpb);
}

15  Escala negativa impar : el objeto tiene una escala negativa impar (por ejemplo, (1, -1, 1))

Hay números negativos en la configuración de Escala de Transformar

16  Shader deshabilita el procesamiento por lotes : el sombreador deshabilita explícitamente el procesamiento por lotes con la etiqueta "DisableBatching"

el sombreador tiene etiquetas

"DisableBatching"="True"

Por ejemplo, algunos sombreadores de animación de vértice no quieren ser agrupados.

17  Demasiados índices en lote dinámico : hay demasiados índices (más de 32k) en un lote dinámico ;Demasiados índices en lote estático : hay demasiados índices en la malla combinada de un lote estático. El límite es de 48k índices en OpenGL ES, 32k en OSX y 64k en otras plataformas

Aquí está la advertencia cuando el índice supera los 32K en lotes dinámicos y lotes estáticos. No encontré esto en la prueba. Cuando el lote estático de prueba excede el índice, para exceder el índice, genero muchas Cápsulas en la escena. La advertencia observada en el framedebuger es que los objetos pertenecen a diferentes lotes estáticos. ¿Cambiará el procesamiento por lotes estático? . CombineMesh se generará cuando el editor se esté ejecutando. Si se excede el índice, se generarán múltiples CombineMesh. Entonces, el error reportado aquí pertenece a diferentes lotes. . Las advertencias en la prueba dinámica por lotes son consistentes.

18  Demasiados vértices para el procesamiento por lotes dinámico : una submalla que estamos tratando de procesar por lotes dinámicamente tiene más de 300 vértices

El lote dinámico de objetos tiene más de 300 vértices. ¿Cuál es el concepto de 300? La bola Esfera creada al hacer clic con el botón derecho tiene 515 vértices y la cápsula Cápsula tiene 550 vértices. El material del objeto aquí no tiene la función de instancia de GPU, si la tiene, le pedirá que active la función de instancia de GPU. Enfatizo aquí que otros documentos pueden estar equivocados. No importa cuántos atributos de vértice utilice en el sombreador de vértices, no creará un lote de forma dinámica en un objeto con más de 300 vértices.

19  Demasiados atributos de vértice para el procesamiento por lotes dinámico : una submalla que estamos tratando de procesar por lotes dinámicamente tiene más de 900 atributos de vértice

Muchos atributos de vértice se llaman en el sombreador de vértices del sombreador de objetos. Si el número total supera los 900, el objeto no se agrupará dinámicamente por lotes. Aquí, 900 se refiere a la suma de los atributos de los vértices y no al número de vértices.

20 Las condiciones de falla de lote indicadas en el documento

La cantidad de objetos supera los 4000, porque no quiero procesar muchos trabajos en un lote, lo que afectará el rendimiento de la llamada.

El lote dinámico contiene un máximo de 88 procesadores a la vez, y la memoria asignada por el motor a cada subproceso puede no permitir más de 88 procesadores, lo que puede provocar un desbordamiento de la memoria.

Por lo tanto, no se recomienda crear demasiados renderizadores con una pequeña cantidad de vértices, ya que esto también interrumpirá el lote.

Supongo que te gusta

Origin blog.csdn.net/LM514104/article/details/109247288
Recomendado
Clasificación