Content directories: Beyond the AssetBundle
George Ing - Unity Technologies
Senior Engineering Manager
Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.
Un poco sobre el contenido en Unity hoy
Desde Unity 2.1, el sencillo AssetBundle ha sido la base del contenido de Unity que se distribuye fuera del binario Player. En los últimos veinte años, una cantidad extraordinaria de juegos ha utilizado AssetBundles como representación de sus datos, incluyendo algunos de los títulos más importantes del mundo.
En su nivel más básico, cada AssetBundle es una unidad indivisible para su distribución, almacenamiento y carga. Los AssetBundles gestionan sus dependencias a nivel de paquete, formando una unidad monolítica más grande que, por motivos de eficiencia, debe descargarse, cargarse y descargarse conjuntamente.
Debido a esta especificación, la forma en que un título define su diseño AssetBundle es un factor primordial en todo, desde su rendimiento en tiempo de ejecución hasta su tamaño de descarga. Esto es cierto tanto si se utilizan los AssetBundles directamente como si se utilizan a través del paquete Addressables .
Hoy vamos a hablar de algo diferente para el entorno de ejecución de Unity .
Presentación de directorios de contenido
Los directorios de contenido son una alternativa fundamental, más eficiente y con mayor capacidad de detalle que los AssetBundles. Actualmente están disponibles en Unity 6.6 como alternativa a los AssetBundles que vienen incluidos con el reproductor. Durante la generación de Unity 7, la pila tecnológica se ampliará para gestionar la entrega inalámbrica completa y granular (más sobre esto más adelante; es realmente genial).
En lugar de integrar los recursos en grandes unidades cargables, los directorios de contenido proporcionan al entorno de ejecución de Unity la capacidad de identificar, cargar y descargar artefactos individuales de forma independiente.(mallas, texturas, etc.) con saturación total de los recursos de hardware y deduplicación implícita de contenido.

Gestionar el contenido en los proyectos de Unity ahora es más fácil que nunca, con compilaciones más rápidas y menos preocupaciones sobre la ubicación de los recursos y la estructura de los AssetBundle.
Los juegos que crees serán más pequeños, más rápidos, con deduplicación implícita y acceso a una gestión de memoria dinámica completa mediante un nuevo tipo de referencia cargable. Para las personas que usan Addressables para el contenido incluido con el reproductor, pueden cambiar a directorios de contenido conCambios sin código.
¿Cómo lo logramos? Analicemos en detalle cada etapa del proceso.
Una base familiar: Construir
En 2019, estábamos debatiendo sobre qué características buscaríamos en una plataforma de compilación sólida en Unity : procesamiento paralelo en todos los núcleos, determinista, con caché completa y capaz de compartir sus datos de compilación entre máquinas. Pues resulta que algunos de nuestros compañeros llevaban años distribuyendo una API con exactamente esas propiedades: el marco de importación de activos.
Por lo tanto, el proceso de creación del directorio de contenido se ejecuta dentro del marco estándar del importador de recursos. Cada recurso se crea individualmente mediante un importador de recursos, en un entorno aislado y fuera del proceso principal. Las compilaciones son deterministas, con almacenamiento en caché de la base de datos de activos, saturación total de todos los núcleos de hardware y compatibilidad con aceleradores nativos para compilaciones compartidas rápidas.
Puede que no sea la primera vez que oyes hablar de este sistema de compilación. Algunos de ustedes recordarán el proceso de compilación multiproceso que presentamos brevemente en Unity 2023.1. Esta es la misma base.

El resultado es un grupo flexible de artefactos muy específicos, un pequeño manifiesto que rastrea las dependencias entre ellos y un nuevo conjunto de archivos de diagnóstico para que sea más fácil que nunca comprender la compilación.
Es increíblemente sencillo.
Una base familiar: Direccionamiento
Si abres una compilación de directorio de contenido y echas un vistazo a los artefactos, notarás que cada artefacto tiene un nombre hash bastante extraño:
c0152db4dd710be51b2decb997325f34.cff0a44ad4a4babd121543fd44032928e7.resS4226b5c16a50dab6eff0f08dd1253d4b.resource
Lo interesante es que no se trata de un hash aleatorio. En cambio, el sistema de directorio de contenido utiliza el mismo patrón de almacenamiento de contenido direccionado que utilizan tecnologías como Git. Cada archivo de contenido se nombra y se referencia mediante un hash de su contenido. Este patrón resulta increíblemente útil para el entorno de ejecución de Unity, ya que le permite eliminar contenido duplicado de forma implícita como una característica nativa.
Dicho esto, el almacenamiento direccionado por contenido con un verdadero gráfico de dependencias conlleva un alto riesgo de rotación de usuarios. Consideremos la relación más simple posible entre dos artefactos:
A → B
Actualizar B y los cambios en el hash de B. Desafortunadamente, como A hace referencia a B, el hash de A también cambia. Lo que es peor, eso tiene un efecto dominó que se extiende por toda la cadena de mando.
En cambio, los artefactos no se referencian entre sí mediante un hash de contenido, sino mediante un identificador estable. El manifiesto de compilación mantiene una pequeña tabla de búsqueda que relaciona los identificadores estables con los hashes del contenido.
¡Con esto, el entorno de ejecución tiene todo lo necesario para cargarse!
Una base familiar: Carga
En los directorios de contenido, introducimos un sistema de carga dinámica de rendimiento excepcional.
Cuando se monta un directorio de contenido, el sistema de carga lee el manifiesto y resuelve las dependencias de ID estables entre los artefactos. Permite que cada artefacto se cargue y descargue de forma totalmente independiente, sin contaminación alguna por artefactos ubicados en el mismo lugar. (¿Recuerdan aquel problema con AssetBundles: una unidad monolítica e indivisible?) Desaparecido.)
Para los usuarios de DOTS, el formato de archivo subyacente de los artefactos también puede resultarles bastante familiar. Los directorios de contenido generan y cargan la próxima generación del formato de archivo de contenido que presentamos en DOTS en 2022, lo que permite que la tecnología que ha impulsado la carga de Entities multihilo durante cuatro años se aplique a todos los activos.
Se trata de un sistema de carga totalmente asíncrono tanto para las operaciones de lectura como para las de deserialización. Esto implica un mayor ancho de banda de carga y la utilización de las API de lectura asíncrona específicas de la plataforma.

Lo que es aún más emocionante, la base del directorio de contenido nos permite traer por primera vez a Unity un tipo de referencia cargable moderno, llamado Loadable .
Malla corporal cargable;bodyMesh.Load();
Se trata de una referencia cargable real, integrada directamente en el motor para proyectos basados en directorios de contenido. Los objetos a los que hacen referencia los Loadables se incluirán en la compilación, pero no se cargarán hasta que se invoque el Loadable. La combinación de Loadables con la interfaz (muy) familiar de ScriptableObject permite organizar el contenido cargado dinámicamente con una rapidez increíble .
Ese es un principio que nos entusiasma mucho. Con directorios de contenido y Loadables como base, cualquieractivoEn Unity, puede convertirse en una unidad que se carga y descarga de forma independiente (una capacidad integrada directamente en el motor), desde las piezas de un creador de personajes hasta los fragmentos de un terreno transmitido, sin diseños de AssetBundle ni definiciones de grupo que tener en cuenta.
¡Crear juegos a gran escala en Unity nunca ha sido tan fácil!
Poniendo a prueba los directorios de contenido: Ranchero de limo 2
En los últimos meses, algunos de nuestros socios han tenido la amabilidad de permitirnos probar directorios de contenido con sus juegos.
Como ejemplo, echemos un vistazo al excelente juego Slime Rancher 2 de Monomi Park y algunos de los beneficios que obtiene al cambiar a directorios de contenido. (¡Slime Rancher está disponible en Steam!) Slime Rancher , Slime Rancher 2 )
Estos datos se basan en la versión Unity 6.6 Beta (6000.6.0b10) del editor de Unity , ejecutada en un MacBook Pro (M5 Max).
Lo mejor es que los usuarios pueden apreciar de inmediato las ventajas del nuevo sistema de carga. Lo que es aún más genial es que Slime Rancher 2 es un proyecto Addressables ya existente que ha cambiado a directorios de contenido sin realizar ningún cambio en el código.
Sinceramente, estamos deseando ver qué beneficios obtendrán los juegos del ecosistema Unity con el lanzamiento de los directorios de contenido en la versión 6.6. Pero surge una pregunta: ¿qué ocurre con el contenido remoto?
¿Qué sigue?: entrega de contenido remoto
Quienes asistieron a la presentación de la hoja de ruta de Unite Seoul de este año recordarán que Jason Mann adelantó que nuestra nueva plataforma de directorio de contenido facilitaría enormemente la entrega remota de contenido durante la próxima generación de Unity 7. Hablemos brevemente de lo que eso significa en realidad y de cómo encaja con los elementos que hemos analizado hasta ahora.
En resumen, con los directorios de contenido, tenemos un pequeño manifiesto basado en hash que es capaz de identificar de forma única los artefactos y sus dependencias. La pregunta es: ¿todos esos artefactos tienen que venir incluidos con el jugador?
La respuesta es un rotundo no.

Gracias a los estándares HTTP modernos, Unity ahora puede multiplexar grandes volúmenes de solicitudes de recursos.
Si a eso le sumamos la base del directorio de contenido, el entorno de ejecución puede determinar con exactitud qué artefactos le faltan a un dispositivo, descargar solo esos en el almacenamiento local y cargarlos, sin preocuparse por la ubicación conjunta, la organización de los datos o los AssetBundles dependientes. Las actualizaciones se propagan a nivel de artefacto individual, y debido a que el manifiesto funciona utilizando hashes de contenido, el entorno de ejecución puede determinar fácilmente qué artefactos están desactualizados y obtener solo la diferencia.
Este entorno de ejecución de Unity, que llegará en un futuro próximo, descarga solo el contenido que necesita, lo que reduce el tiempo de desarrollo, permite que los jugadores accedan a los juegos más rápidamente y disminuye drásticamente los costes de la CDN.
Compartiremos más detalles sobre este proyecto en 2027.
Prueba los directorios de contenido en Unity 6.6 hoy mismo.
Lo que compartimos hoy es la primera etapa de un largo camino para renovar el contenido en Unity, implementando el "rendimiento por defecto" en todo el entorno de ejecución. Los directorios de contenido están disponibles en la versión 6.6 para el contenido que se incluye con el reproductor, y se ampliarán para gestionar contenido remoto en la generación de Unity 7.
Para empezar a usar los directorios de contenido, consulta nuestra documentación y, si tienes algún comentario, ponte en contacto con nosotros .
¡Gracias de nuevo a nuestros amigos de Monomi Park por ayudarnos a mostrar los directorios de contenido con su fantástico título! ( Slime Rancher , Slime Rancher 2 ).