Consejos para mejorar el rendimiento de tu juego Unity. Parte 1

Hola. Anticipándose al inicio del curso “Unity Game Developer. Basic ”ha preparado una traducción útil para usted.








Introducción



Cuando creamos juegos, a menudo pasamos por alto uno de los aspectos más importantes del desarrollo de juegos: la optimización. Como resultado, obtenemos retrasos y FPS bajos (a veces incluso en dispositivos de gama alta, si todo está realmente funcionando). La mayoría de la gente siempre verá la optimización del juego como el último paso, y este es el primer error; siempre debe ser el primer elemento de la lista.



Es imposible sobreestimar el hábito con cada compilación, todos los días cuando agregas una nueva mecánica o una nueva configuración de iluminación, o cualquier sistema basado en la física a tus juegos, siempre revisa la compilación para ver si hay algún problema de rendimiento debido a estos el cambio es una buena práctica de desarrollo de juegos.



Si no se toma el tiempo para optimizar el rendimiento desde el inicio de un proyecto, puede terminar en problemas para usted y su juego en las etapas finales. Aquí quiero compartir algunos pensamientos y consejos sobre cómo puede mejorar el rendimiento de su juego en base a algunas lecciones prácticas que he aprendido de mis errores durante los últimos 5 años.



Perfila tu juego



Profiler es el primero en la lista y una de mis herramientas favoritas de todos los tiempos en Unity para monitorear el rendimiento del juego y ver qué está causando realmente los problemas de rendimiento. Es muy útil para obtener una comprensión detallada de cómo reacciona su juego a varios cambios en el editor.





Puede encontrar el generador de perfiles en Ventana-> Análisis-> Generador de perfiles.



Muestra categorías como uso de CPU y GPU, renderizado, física, audio y más. No podemos confiar en la creación de perfiles en el editor (creación de perfiles del editor), ya que el editor afecta el rendimiento del proyecto durante la prueba y esto puede afectar la validez de la información de creación de perfiles. Es mejor crear una compilación separada para obtener datos de perfiles precisos.



Perfilado remoto



Para que funcione, debe instalar Android SDK y conectar JDK y depuración USB. Recuerde, siempre es una buena idea probar el rendimiento de su juego en lo que respecta a la mecánica, la escala de la interfaz de usuario, etc. Sin mencionar la prueba del rendimiento real del juego junto con lo anterior. Para probar el rendimiento real del juego, debes crear una compilación de perfiles personalizada.





Para conectar Remote Profiler, vaya a Editar> Configuración del proyecto> Editor y en la sección Dispositivo seleccione Cualquier dispositivo Android.



Creación de perfiles



Para asegurarse de que Unity tenga acceso a su compilación que pueda ser perfilada, debe habilitar "Compilación de desarrollo o Soporte de creación de perfiles profundos" y "Conexión automática del perfilador" en la configuración de compilación antes de crearla. Esto permite que el editor de Unity vincule automáticamente su compilación.







Cuando su oferta esté lista, abra su juego sin cerrar la ventana de Unity Profiler. Unity ahora mostrará automáticamente los datos de rendimiento de la versión actual del juego en la ventana del generador de perfiles.



Puede encontrar más información sobre el generador de perfiles aquí .



Agrupar GameObjects



El procesamiento por lotes es una técnica muy buena para mejorar el rendimiento al reducir el número de llamadas de Draw, que agrupa la representación de varios GameObjects similares en una sola llamada de Draw. Hay dos tipos de métodos de procesamiento por lotes: estático y dinámico. Existen algunas limitaciones para el procesamiento por lotes: no podemos procesar mallas, telas y algunos componentes de revoque por lotes.



Procesamiento por lotes estático



El procesamiento por lotes estático se utiliza siempre que los GameObjects son estáticos. Dichos GameObjects estáticos no deben moverse, escalar ni rotar, y deben usar el mismo material para todos los GameObjects estáticos para que el procesamiento por lotes funcione.



Si tus GameObjects no interactúan con tu Player, o si no estás cambiando Transform, entonces es mejor usar lotes estáticos para la mayoría de los entornos de tu juego, como edificios, carreteras, etc.







Procesamiento por lotes dinámico



Dynamic Batching es similar a static en que GameObjects debe usar los mismos materiales, pero puede agrupar objetos en movimiento sin tener que hacerlos estáticos. Básicamente, Unity puede cargar automáticamente GameObjects en la misma llamada de dibujo si usan el mismo material, pero tienen algunas de las restricciones dinámicas de procesamiento por lotes que se les imponen según Unity:



  1. El procesamiento por lotes de GameObjects dinámicos tiene una cierta sobrecarga por vértice, por lo que el procesamiento por lotes solo se aplica a mallas con no más de 300 vértices y no más de 900 atributos de vértice.

    • Shader Vertex Position, Normal UV, 300 , Shader Vertex Position, Normal, UV0, UV1 Tangent, 180 .
    • : .
  2. GameObject- , transform (, GameObject A +1 GameObject B –1 ).
  3. Material , GameObject- , . Shadow Caster.
  4. : / . , GameObject- .
  5. Multi-pass .

    • Unity , . « » .
    • Legacy Deferred ( ) , GameObject .


El procesamiento por lotes dinámico funciona de manera diferente para sistemas de partículas, líneas de renderizado y renderizado de senderos que para mallas.



  1. Para cada tipo de renderizador compatible, Unity recopila todo el contenido del lote en 1 búfer de vértice grande.
  2. El renderizador establece el estado del material por lotes.
  3. Unity une Vertex Buffer al dispositivo gráfico.
  4. Para cada renderizador en el lote, Unity actualiza el desplazamiento en Vertex Buffer y luego envía una nueva llamada de dibujo.


Hay otras formas de mejorar el procesamiento por lotes usando algunos activos de Assetstore como Simple Mesh Combine, Bakery, o también podemos usar Mesh.CombineMeshespara combinar múltiples mallas en una, lo cual es ideal para optimizar el rendimiento.



Hornea tu iluminación



En términos generales, hay tres modos de iluminación: Realtime, Baked y Mixed.



El tiempo real es lo mejor, PERO tienes que pagarlo con rendimiento. Trae luz directa a la escena y actualiza cada cuadro a medida que las luces y los objetos del juego se mueven dentro de la escena, actualizando la iluminación de inmediato.



Siempre que tenga la opción de hornear iluminación en un escenario, asegúrese de usarla porque es ideal para aumentar la productividad, especialmente si se dirige a dispositivos móviles. Siempre es mejor usar poca iluminación en el escenario para lograr el aspecto deseado.







De esta manera, todas sus luces se calcularán previamente fuera de línea en un proceso llamado Lightmap Baking. Cuando configura el indicador estático de GameObject Lightmap, Unity hornea la información sobre GameObject Light, sombras, luces rebotadas y sombras suaves en texturas que tocan su escena. Sin embargo, Lightmaps tiene algunas limitaciones, la iluminación no puede actualizarse dinámicamente para los objetos que seleccione con el indicador estático de Lightmap.











Hace unos meses, en mi tiempo libre, hice una escena SCIFI y creo que este es el mejor ejemplo de cómo funciona la iluminación horneada. Por supuesto que usé Emission.



Si alguien está interesado en una descripción general de cómo se creó esta escena SCIFI y cómo logré este aspecto, hágamelo saber, tal vez podría dedicar un artículo separado a esto.

, !







Esta es una muy buena forma de mejorar el rendimiento de tu juego con la oclusión Unity. En general, Occlusion Culling significa que Unity no mostrará GameObjects que estén completamente ocultos desde la perspectiva de la cámara (ocluidos) por otros GameObjects.





Para abrir la ventana Oclusión, vaya a Ventana-> Renderizado-> Eliminación de oclusión.





Si alguien está interesado en cómo logré este aspecto en la escena Mystery Forest, avíseme, tal vez podría escribir un artículo separado al respecto.

¡Aquí hay un video si estás interesado!


twitter.com/i/status/1096336962259021824



De forma predeterminada, Unity aplica Frustum Culling, lo que significa que solo muestra la línea de visión de la cámara, mostrando todos los objetos. Por ejemplo, si la cámara está mirando a una pared, también se renderizarán todos los objetos detrás de esa pared. No necesitamos esto en absoluto, por lo que debemos agregar Occlusion Culling a nuestra escena.







Es por eso que tenemos que usar Occlusion Culling, lo que significa que la cámara solo renderizará la pared sin objetos detrás de ella.





Lee mas:






All Articles