Solución de optimización del rendimiento de Unity

Solución de optimización del rendimiento de Unity

1.Unity 性能调试工具及使用方法
2.垃圾回收(Garbage Collection)
3.CPU相关优化
4.GPU相关优化
5.使用UPR(Unity Performance Reporting)云服务进行性能测试

lo que hay que hacer cada cuadro

  • El tiempo necesario para renderizar un fotograma > el tiempo necesario para el cálculo de la CPU + el tiempo necesario para el cálculo de la GPU
  • (Por ejemplo, si los cálculos físicos y los scripts en la CPU toman mucho tiempo para ejecutarse, no importa qué tan bien esté optimizado Shader, no aumentará la velocidad de cuadros; por el contrario, si la presión en la GPU es alta, luego, optimizar el sistema físico y los scripts también ayudará. Aumentar la velocidad de fotogramas no ayuda mucho. Por lo tanto, analizamos para encontrar el eslabón débil en todo el sistema, que es la placa más baja en el balde con fugas).

De qué son responsables la CPU y la GPU

  1. CPU 相关:Skinning,Batching(Static Batching,Dinámico
  2. procesamiento por lotes, etc.), relacionados con la física, scripts de usuario, efectos de partículas, etc. Relacionados con GPU: Shader, Drawcalls, Image
  3. Efectos (postprocesamiento) Pero la CPU y la GPU no están aisladas:
  4. Draw Call es demasiado alto -> use la CPU para hacer procesamiento por lotes para reducir Draw Call -> mejora del rendimiento
  5. Draw Call no es alto -> use la CPU para hacer lotes para reducir Draw Call -> desperdicie la potencia de procesamiento de la CPU, lo que resulta en una disminución de la eficiencia de eliminación -> degradación del rendimiento

El entorno utilizado al optimizar

Optimizar la configuración del proyecto

  • Abra la interfaz de configuración del proyecto a través de Editar/Configuración del proyecto en el menú superior del editor. Busque la interfaz de Otras configuraciones en Reproductor.
  • Asegúrese de que el procesamiento por lotes estático, el procesamiento por lotes dinámico, el revestimiento de GPU y los trabajos de gráficos estén habilitados.
  • (Si Oculus Quest) Deshabilite ARMv7, habilite ARM64. Seleccione IL2CPP en el cuadro desplegable Scripting Backend, para que todos los códigos C# se conviertan en códigos C++ para mejorar la velocidad de ejecución.
  • (Para Rift y Rift S) Seleccione IL2CPP en el cuadro desplegable Scripting Backend (pero la depuración será un inconveniente), para que pueda usar Mono durante la etapa de desarrollo y cambiar a IL2CPP cuando el paquete se lance oficialmente.
  • Abra la interfaz de configuración de administración del complemento XR, instale el complemento Oculus XR y asegúrese de que esté marcada la opción Inicializar al iniciar.
  • Abra la interfaz de configuración de Oculus, asegúrese de que el búfer de profundidad compartido y la compatibilidad con tablero estén marcados y, a continuación, configure el modo de reproducción estéreo en Instanciado de un solo paso.
  • En la interfaz de configuración de calidad, asegúrese de que solo la opción Media esté marcada en la plataforma Android, y las demás opciones deben estar desmarcadas; se pueden marcar todas las demás plataformas.
  • Establezca Pixel Light Count en 1 o 0 (si la información de iluminación se proporciona a través del sombreador Vertex).
  • Establezca Anti Aliasing en 4x Multi Sampling, que también se puede usar en Oculus Quest, porque la presión sobre la GPU no es grande, pero la calidad de la imagen se puede mejorar mucho.
  • Establezca Sombras en Deshabilitar sombras o Solo sombras duras.
  • Establezca los pesos de mezcla en 2 huesos.
  • Abra la interfaz de configuración de gráficos y asegúrese de que la plataforma Android esté configurada en Bajo o Medio (Oculus Quest).

código relacionado

  • Puede usar Invoke Repeating o Coroutine en lugar del método Update

  • El método Debug.Log() consume mucho rendimiento

  • Preste atención al componente (componente) que a menudo se necesita para el almacenamiento en caché

Optimizaciones relacionadas con la CPU

  • horneado ligero
  • Uso de eliminación de oclusión
  • Mejore el rendimiento de los recursos de malla con Mesh Baker Free
  • Creación de instancias de GPU
  • Atlas de texturas
  • Cuando obtenga el material del script, use Renderer.sharedMaterial en lugar de Renderer.Material, ya que este último generará una nueva copia. Si el material original se procesa por lotes, el lote no será válido.

Uso de eliminación de oclusión

Método general para reducir drawcall

  • Busque la cámara principal en la ventana Jerarquía y use la herramienta de rotación para rotar la cámara en la ventana Escena. Podemos ver que, sin importar en qué dirección mire la cámara, todos los GameObjects en la escena se renderizarán cuando se vean desde arriba en la ventana Escena.
  • Marque la opción Eliminación de oclusión en la cámara principal.
  • En la interfaz de Oclusión, haga clic en el botón Hornear en la esquina inferior derecha y espere un momento para completar la cocción.

Mejore el rendimiento de los recursos de malla con el complemento gratuito Mesh Baker

Este complemento puede fusionar cuadrículas

Un posible efecto secundario de la fusión de cuadrículas es que Occlusion Culling no funciona porque la cuadrícula fusionada es demasiado grande.

Creación de instancias de GPU

  • Se pueden renderizar varios Game Objects que usan la misma malla (Mesh) con menos Draw Calls para mejorar el rendimiento de la renderización.
  • Adecuado para renderizar edificios, bosques, hierba o cualquier modelo que pueda reutilizarse en la escena.
  • Incluso si estos GameObjects tienen diferentes colores, tamaños, etc., siempre que usen la misma cuadrícula, se puede usar la creación de instancias de GPU.
  • También puede usar la API de creación de instancias de GPU en secuencias de comandos para implementar funciones relacionadas:
    Graphics.DrawMeshInstanced y Graphics.DrawMeshInstancedIndirect

Prioridad de procesamiento por lotes de Unity:

  • Procesamiento por lotes estático > Creación de instancias de GPU > Procesamiento por lotes dinámico
    • Si se activa el procesamiento por lotes estático en Configuración del proyecto > Interfaz del reproductor, el GameObject también se establece en procesamiento por lotes estático y la creación de instancias de GPU del material está activada: se mostrará una advertencia en el Inspector, indicando que la creación de instancias de GPU se desactivará.

Optimización relacionada con GPU

  • Tres aspectos de la optimización de GPU:
    • Tasa de relleno:
      • Tasa de relleno de píxeles: la cantidad de píxeles que la GPU puede dibujar en la pantalla por segundo
      • Tasa de relleno de texturas: la cantidad de texturas que la GPU puede ver por segundo
  • Ancho de banda de memoria GPU:
    • La cantidad de datos (en bytes) que la GPU puede transferir a la memoria de video (VRAM) por segundo
  • Procesamiento de vértices (procesamiento de vértices):
    • número de vértices en la malla
    • El número de operaciones a realizar para cada vértice.

Método de inspección

  1. Ver el tiempo que la GPU dedica a renderizar en Profiler
  2. Reducir la resolución en la configuración del reproductor
  3. Vuelva a ejecutar para verificar el tiempo de renderizado de la GPU
  4. Si el rendimiento mejora, significa que la GPU es demasiado tarde para renderizar y hay un problema de que la tasa de llenado no es suficiente

Método de optimización específico:

  • Reduzca la complejidad del sombreador de fragmentos en el sombreador, porque el sombreador de fragmentos es responsable de decirle a la GPU cómo dibujar píxeles en la pantalla.
  • Use un Shader más optimizado, como Mobile Shader (Mobile Shader también se puede usar en otros lugares que no sean plataformas móviles)
  • Si está utilizando Standard Shader, puede reducir la cantidad de texturas utilizadas, de modo que Unity se optimice automáticamente al compilar.
  • Es necesario analizar el impacto del Efecto de imagen utilizado en la Tasa de relleno general. Si el impacto es realmente grande, algunos Efectos de imagen deben desactivarse.

Ancho de banda de memoria GPU

  • Ver el tiempo que la GPU dedica a renderizar en Profiler
  • Baje la configuración de Calidad de textura en Configuración de calidad
  • Vuelva a ejecutar para verificar el tiempo de renderizado de la GPU
  • Si se mejora el rendimiento, significa que la textura es demasiado grande y la memoria de video no es suficiente

Método de optimización específico:

  1. Compresión de textura
  2. Mipmap 和 Transmisión de Mipmap

Compresión de textura

  • Optimización de la compresión de texturas:
    • Por ejemplo: Construir Después de completar la construcción, se generará un registro de construcción en el registro del editor, abra la ventana Ventana > Consola y haga clic en el menú Abrir registro del editor en los tres íconos de puntos en la esquina superior derecha de la ventana de la consola. Busque en el texto abierto: Activos usados ​​y archivos de la carpeta Recursos, ordenados por tamaño sin comprimir,
      donde puede ver todas las texturas usadas en el proyecto pero sin comprimir.
    • Hay varios métodos de compresión correspondientes para cambiar el atributo de compresión de una imagen.

Mipmap 和 Transmisión de Mipmap

  • Mipmap en Unity es equivalente a la tecnología Lod de Texture, para evitar que aparezcan rayas debido a una tasa de muestreo insuficiente de la textura cuando el objeto está lejos de la cámara. El método para generar Lod en Unity es muy simple, marque Generar mapas Mip en el panel Textura y luego haga clic en Aplicar. Una vez completada la generación, puede ver las imágenes correspondientes a cada nivel a continuación. El principio debe ser el método de muestreo medio.
  • Mipmap es un método típico para intercambiar espacio de almacenamiento por uso de memoria (si la dirección Z del recurso no cambia, usar Mipmap es un desperdicio :)
  • La tecnología Texture Steaming resuelve el problema de cargar toda la pirámide Texture Mipmap cuando Shader renderiza. El efecto de optimización es muy bueno cuando el modelo está lejos de la cámara. En otras palabras, el efecto de optimización del gran juego mundial es muy bueno. Cuando la cámara ve la imagen, se calculará un nivel de mipmap razonable y luego recortará todos los mipmaps de otros niveles. No cargar, también configurado en MaxLevelReduction. Cuando el juego se está ejecutando, habrá un proceso primero de desenfoque y luego de limpieza.

Procesamiento de vértices

  1. Minimiza el número de vértices en la malla (simplifica el modelo)
  2. Use el mapa normal para expresar los detalles del modelo
  3. Si el mapa normal no se usa en el modelo, la opción Tangentes de vértice de este modelo se puede desactivar en la interfaz de configuración de importación de modelo.
  4. Usar LOD
  5. Reduzca la complejidad del sombreador de vértices en el sombreador personalizado (el sombreador de vértices es el bloque de código en el sombreador que le dice a la GPU cómo dibujar cada vértice)
  6. Si está utilizando el sombreador estándar, intente usar un sombreador simple como Mobile Shader.
  7. Si el Mapa normal no se usa en el modelo, puede establecer Normales en Ninguno en la interfaz Configuración de importación de modelo
  8. Si la cuadrícula no se genera dinámicamente, o los datos de la cuadrícula deben copiarse en tiempo de ejecución, la opción Lectura/escritura habilitada no debe activarse.
  9. Si la lectura y escritura están habilitadas, la información de la cuadrícula se cargará tanto en la GPU como en la CPU; de lo contrario, solo se cargará en la GPU. Por lo tanto, generalmente no se abre la opción de lectura y escritura, lo que puede ahorrar memoria.
  10. Puede reducir la cantidad de vértices del modelo mediante el uso de texturas y mapas normales, diseñar UV de manera racional para evitar costuras y permitir que las texturas se distribuyan uniformemente en la superficie del modelo, reutilizar modelos y usar instancias y procesamiento por lotes estático para fusionar modelos y reducir la cantidad de dibujos. Llamadas.
  11. Los jugadores recogerán objetos y los observarán muy de cerca, por lo que el diseño de la realidad virtual debe ser muy uniforme, ya que se pueden observar desde cualquier ángulo en la realidad virtual.
  12. También preste atención a los detalles como las costuras de textura, ya que el jugador observará con atención.
  13. Limitar la cantidad de materiales utilizados puede reducir el Draw Call y reducir la carga en la GPU.
  14. Los modelos diseñados y producidos de manera modular se pueden reutilizar tanto como sea posible.

Recomendaciones para escalar el tamaño de los activos:

  1. Es muy importante asegurarse de que los objetos de la escena tengan un tamaño uniforme. Si los objetos de la escena no tienen un tamaño uniforme, como una puerta más corta que una persona o un automóvil del tamaño de una montaña, hará que las personas se sientan irreales.
  2. Además, el método de cambiar dinámicamente el FOV comúnmente utilizado en juegos ordinarios no es aplicable en VR. En VR, se recomienda mantener el FOV constante.
  3. Al escalar el modelo en la escena, para garantizar un efecto físico uniforme, el tamaño del cuerpo de colisión también debe escalarse en consecuencia. De lo contrario, el efecto de la simulación física será irreal.
  4. Cuando las personas experimentan la realidad virtual, generalmente clavan la cabeza en los modelos de la escena, queriendo ver lugares que no deberían ver. Podemos diseñar que cuando se detecte que el jugador gira la cabeza hacia el modelo, toda la pantalla se oscurecerá de forma paulatina. Para hacer esto, debemos establecer el tamaño correcto del colisionador para todos los modelos relevantes.

Supongo que te gusta

Origin blog.csdn.net/bellainvan/article/details/127002843
Recomendado
Clasificación