♪♪ Hola a todos. Mi nombre es Oz, y soy un evangelista de desarrollo de juegos en Backtrace Source Labs. Hoy, vamos a ver algunas de las formas en que podemos evitar problemas comunes de performance y memoria que surgen en las compilaciones de Unity WebGL. El primer punto que vamos a examinar es la gestión del performance. Y una restricción importante al ejecutar una compilación de WebGL en un navegador con buen performance es la memoria. Entonces, en términos de memoria, ¿cuáles son los problemas y cuáles son las consideraciones que debemos examinar?
Entonces, como sabes, la complejidad del contenido que puedes ejecutar está limitada por la memoria. La memoria es asignada por el navegador, y la cantidad de memoria que tiene disponible varía en función de varios factores, incluyendo el dispositivo que usas, el sistema operativo que usas, qué navegador usas, y si se ejecuta en un navegador de 32 bits o de 62 bits, y un par de otros factores. Entonces, para entender cómo la memoria impacta en el performance, es muy importante primero ver cómo se asigna la memoria en una compilación de Unity WebGL. Para esto, necesitamos echar un vistazo al montón de Unity. Entonces, ¿qué es el montón de Unity o un montón de memoria, como lo llama Unity? Básicamente, aquí es donde se almacenan todos los objetos en tiempo de ejecución, y estos podrían incluir objetos nativos, activos que se cargan, escenas, shaders, archivos de animation, así como otros objetos gestionados. Vale la pena mencionar que este montón es un bloque contiguo de memoria asignada. Hasta hace unos años, tenías que asignar el tamaño máximo del montón en la configuración de la compilación, pero ahora, Unity soporta la expansión del montón a demanda, dependiendo de las necesidades del juego, y es expandible hasta dos juegos. Sin embargo, la misma característica puede hacer que tu juego se bloquee, especialmente cuando el navegador falla al asignar un bloque contiguo de memoria, y es exactamente por eso que es muy importante mantener el tamaño del montón lo más pequeño posible.
Ahora, para entender cómo podemos mantener el tamaño del montón de memoria pequeño, primero tenemos que echar un vistazo a lo que Unity hace con todos los activos y los datos de la escena en un navegador, y qué sucede cuando construyes una aplicación WebGL en Unity. Entonces, cuando construyes una aplicación WebGL, lo que sucede es que Unity genera un archivo .data. Y esto es básicamente todos los activos y escenas en la aplicación que se requieren en el momento del lanzamiento, y todo eso se empaqueta en un archivo .data, incluyendo las escenas de Unity, texturas, modelos, precios de UI, activos de audio, shaders, y prácticamente todo lo demás que necesitas para que el juego funcione. Y básicamente Unity WebGL no tiene acceso a un sistema de archivos real, por lo que tiene que crear un sistema de archivos de memoria virtual, y el navegador luego desempaqueta el archivo .data en este sistema de archivos virtual particular. Y el navegador, mientras el juego está en ejecución, mantiene los data sin comprimir. Ahora imagina si tienes una escena compleja con todo tipo de activos, ¿verdad? Incluyendo modelos 3D, shaders, todo. Entonces puedes ver cómo posiblemente puede tener problemas de memoria y también ralentizar el rendimiento del juego. Entonces la pregunta que surge es, ¿qué puedes hacer para reducir la memoria? Bueno, hay algunas técnicas que puedes adoptar para reducir el uso de memoria. Y una forma, la más común, es usar paquetes de activos. Entonces podrías poner todos los activos más frecuentes, pero más grandes en un paquete de activos y cargarlo, descargarlo a demanda cuando quieras. También vale la pena mencionar que los paquetes de activos se descargan directamente en el montón de Unity y por lo tanto evitan la asignación extra realizada por un navegador. Si hay paquetes grandes, una técnica es posiblemente almacenar en caché los data y esto es básicamente una cosa adicional que te ayuda a evitar la descarga cada vez que realmente juegas el juego. Entonces el tercero es algo llamado sistema direccionable, que es una alternativa a los paquetes de activos. Y a veces se inicia como una versión mejor de los paquetes de activos. Sin embargo, tiene algunos de sus propios problemas, incluyendo el soporte de las compilaciones de WebGL de serie. Pero existen algunas soluciones para hacerlo funcionar. La próxima consideración importante con respecto a las compilaciones de WebGL es la recolección de basura o GC en resumen.
Comments