Guía para optimizar Unity UI
Si una cosa hay que tener en cuenta cuando desarrollamos un videojuego, y que sobretodo por desgracia sólo se tiene en cuenta en las fases finales del desarrollo, es la optimización del mismo. Muchos títulos que descuidan este aspecto reciben gran cantidad de quejas y de críticas. Uno de los puntos claves que pueden producir picos de caída del rendimiento de nuestro juego puede ser la interfaz de usuario (a partir de ahora UI).
Comprendiendo el funcionamiento del Unity UI
Primero de todo vamos a explicar unos pequeños detalles técnicos sobre el funcionamiento del renderizado del UI en Unity, con estos conceptos un poco más claros nos será más evidente entender los consejos prácticos que expondremos después.
Primero de todo hay que tener claro que cuando se renderiza el UI unity crea una malla para poder representar cada uno de los elementos que hay en el canvas. Cuando hay un cambio en el canvas este se marca como sucio y se informa al sistema que se tiene que recalcular y redibujar.
Otra cosa a tener en cuenta es que los elementos del canvas son los últimos en renderizarse, así que a pesar de que nuestro canvas esté configurado como World Space y haya otros elementos en la escena que lo tapen, los píxeles correspondientes al canvas se calcularán igualmente.
Consejos prácticos para optimizar nuestro UI
Como ya hemos visto cada cambio que se hace en un canvas implica que se recalcule el canvas completo, así que una buena práctica es dividir el UI en diversos canvas, la idea sería agrupar en un mismo canvas los elementos que sean más susceptibles de actualizarse al mismo tiempo, como podría ser la energía del ataque que va bajando cada vez que golpeamos y los puntos de experiencia que vamos ganando por eliminar enemigos. Un punto interesante a tener en cuenta, es que podemos crear un canvas dentro de otro canvas. Si el canvas hijo se ve modificado no afectará a todo el canvas padre, ya que cada canvas está aislado, así que simplemente se debería volver a calcular los elementos del canvas hijo, pero en ningún caso los del padre.
Otro punto a tener en cuenta son los elementos interactivos de nuestro canvas. Los elementos de UI que creamos en Unity tienen la propiedad Raycast Target esta propiedad hace que los elementos del canvas sean susceptibles de ser clicados o tocados, es decir que puedan recibir un input. Esto se traduce en que cada vez que nosotros hacemos click o touch sobre la pantalla Unity revisa si hay algún elemento del UI que tenga marcada esta propiedad y que quede en la línea de proyección de esa interacción con la pantalla. Si todos los elementos de nuestro canvas tiene la propiedad de raycast activada estaremos haciendo que Unity realice más cálculos de los necesarios haciendo más lento al sistema. Por eso es importante asegurarnos que todos los elementos del UI con los que no vaya a ser posible interactuar tengan desmarcada la opción de Raycast Target.
El uso de las cámaras en los canvas definidos con un Render Mode de Screen Space o World Space, también es importante. Si en estos dos modos no le especificamos qué cámara vamos a usar Unity por defecto irá a buscar la main Camera de nuestra escena. Pero para realizar esta búsqueda de manera automática se verá obligado a realizar una búsqueda mediante el método Find, es decir, deberá pasar por todos los objetos de nuestra escena hasta dar con el que responda a la MainCamera. El uso de métodos de tipo Find está totalmente desaconsejado a nivel de rendimiento, por eso es muy recomendable que si usamos alguno de estos tipos de render mode especifiquemos siempre la cámara manualmente.
Cuando queremos ocultar un canvas la mejor solución es desactivar el Componente canvas del objeto. Al desactivar el componente el objeto dejará de realizar llamadas a la GPU y el canvas dejará de renderizarse. Además como no ocultamos el objeto que simplemente desactivamos un componente no se ejecutarán ciertas tareas de Garbage Collection que podrían llamarse de forma automática si lo que hiciésemos fuese actuar sobre el objeto, como podrían ser las función de OnDisable.
Uno de los puntos claves de la optimización del UI es reducir el uso de animaciones dentro de la misma, las animaciones provocan que el canvas se marque como sucio en cada frame y se tenga que recalcular, si tenemos que realizar animaciones muy esporádicas es mejor intentar encarar una solución que realice el mismo cambio a través de código siendo esto mucho menos costoso a nivel de rendimiento.
Hemos visto algunos consejos para poder optimizar el uso de nuestro UI en nuestros juegos. Hay que volver a recordar que aunque la tarea de optimización puede ser algo pesada ya que hay que tener muchas cosas en cuenta, y que si no lo planteamos bien desde un principio nos puede llevar a tener que realizar muchos cambios posteriormente, es una tarea clave a la hora de realizar un título de éxito.
¿Estás preparado para sacar el mejor rendimiento a tus juegos? Déjanos tu comentario
Curso relacionado: Curso Superior de Diseño y Desarrollo de Videojuegos con Unity 3D