Recursos virtuales en Unreal Engine 5.1: sincronizaciones más pequeñas y rápidas.

El recién estrenado Unreal Engine 5.1 incluye una nueva función que ayuda con sincronizaciones más pequeñas y rápidas: Recursos virtuales.

Los recursos virtuales, actualmente en beta, permiten desacoplar conjuntos de datos estructurados del conjunto masivo de datos, así que ahora los desarrolladores podrán sincronizar solo lo que necesiten en sistemas de control de código fuente como Perforce. Esto posibilita espacios de trabajo reducidos y sincronizaciones más rápidas a aquellos desarrolladores que no necesitan acceder a los datos completos del objeto.

En este blog de tecnología, dos miembros del equipo de Unreal Engine, Grace Yen, directora de productos sénior, y Paul Chipchase, principal desarrollador de los recursos virtuales, profundizan en esta función para que puedas determinar si encajaría bien con tu proyecto.

¿Qué problemas solucionan los recursos virtuales?

En las últimas generaciones de desarrollo de videojuegos, nos hemos percatado de algunas interesantes tendencias relacionadas con el tamaño de los proyectos. No solo el tamaño de los proyectos es cada vez mayor (realizamos una encuesta informal entre algunos de nuestros licenciatarios para confirmarlo), sino que además muchos desarrolladores se están pasando a un modelo de juegos como servicio (GaaS), con actualizaciones continuas a lo largo de ciclos de varios años.

También hemos comprobado que hay equipos que mejoran de forma continua la manera en la que realizan las actualizaciones. Algunos equipos usan «flujos de funciones» para que las funciones más avanzadas no afecten al resto del equipo hasta que se haya estabilizado la compilación y esté lista para el lanzamiento.

Hemos observado que algunos miembros de los equipos trabajan entre las líneas de lanzamiento de sus productos (para compatibilizar con los servicios en vivo) y también usan modelos de flujos de desarrollo de tipo «principal» y «avanzado».

Esto supone otro desafío según el cual los miembros de los equipos suelen verse al límite de espacio en sus unidades SSD y se ven obligados a tomar decisiones poco eficientes al desincronizar un flujo de trabajo que seguramente vayan a volver a necesitar pronto para dejar espacio a la tarea actual.

Antes de la pandemia, algunos estudios (incluido el nuestro) tenían problemas con los tamaños y los tiempos de sincronización. Implementamos soluciones como los servidores Performance Edge para proporcionar a los usuarios un punto de acceso más rápido. Sin embargo, cuando en 2020 nos vimos obligados a trabajar desde casa, experimentamos la complicación de que algunos miembros no tenían conexiones a internet fiables o sus velocidades de conexión variaban mucho.

Reunir a los mejores equipos suele conllevar que los miembros estén en distintos lugares, y creemos que esa dinámica ha venido para quedarse.  Incluso en un escenario híbrido en el que los miembros de un equipo se mueven entre dos ubicaciones, surge el problema conjunto de la necesidad de sincronizarse en múltiples ocasiones con el hardware asignado según la ubicación.

Con tecnologías tan potentes como Nanite, el sistema de geometría virtualizada de UE5 diseñado para conseguir detalles a escala de píxel y un alto números de objetos, creemos que los tamaños de los proyectos seguirán creciendo aún más en el futuro.
En resumen, el tiempo y el espacio que se invierten en sincronizar aumentan cada vez más, porque:
  • Los proyectos son cada vez más grandes
  • Los juegos viven más tiempo y por lo tanto se les añade más contenido

El problema se magnifica, porque:
  • Los equipos pueden necesitar sincronizar varios flujos de trabajo, como el lanzamiento de nuevas funciones o la gestión de servicios en vivo
  • El hardware físico (como las SSD) es más caro y su aprovisionamiento es más difícil y laborioso
  • El mayor tamaño de los equipos puede dificultar la eficiencia al trabajar
  • Los teletrabajadores y los trabajadores híbridos tienen problemas de sincronización
  • Los equipos que empiezan a sacar provecho de Nanite obtienen una mayor fidelidad visual, pero los conjuntos de datos son mayores


¿Cuál es el enfoque de Epic respecto a los recursos virtuales?

Nuestra solución de recursos virtuales se basa en la idea fundamental de que solo se deben sincronizar los datos que resultan necesarios y de que se debe poder acceder rápidamente a los datos adicionales que harán falta más adelante.

Es un cambio con respecto a las formas en las que los equipos han abordado este problema. Los equipos (incluyendo el nuestro) enseñan a los desarrolladores a configurar sincronizaciones nocturnas planeadas con mucha antelación para minimizar el tiempo de inactividad. Los recursos virtuales no van a cambiar eso. Lo que ofrecen es una forma más rápida y eficiente de sincronizar datos al alcance de todos, sobre todo cuando no se puede planificar con antelación o cuando surge un problema urgente en un flujo de trabajo que aún no está actualizado.

Evaluamos los archivos de paquetes (.umap/.uasset) y vimos una buena oportunidad de reducir los datos que los usuarios tenían que sincronizar. A menudo, los usuarios no necesitan toda la información de un recurso para poder mostrarlo de forma relevante en el editor. Por ejemplo, en el caso de una textura, puede bastar una miniatura y las propiedades del editor, tales como las coordenadas y la escala. Pero el conjunto de datos de un objeto UTexture incluye los datos originales de los píxeles en bruto, que en principio no son necesarios. Con esta base, hemos dividido los recursos en dos partes en segundo plano:
  • Los «datos estructurados» permanecen donde están tus recursos en el código fuente. Contienen todo lo que el editor necesita para cargar y representar el recurso
  • El «conjunto de datos» es la porción que seguramente no será necesaria, y está separada en una zona diferente del código fuente
Uno de nuestros criterios al desarrollar los recursos virtuales era el de respetar los flujos de trabajo existentes de nuestros usuarios. Los miembros de los equipos deberían poder sincronizar y trabajar como siempre, pero más deprisa. Al separar y dejar los metadatos esenciales del recurso en la ubicación original del código fuente, los usuarios podrán sincronizar los datos tal y como lo hacían antes. La herramienta se ocupa del trabajo en segundo plano para extraer los datos necesarios del conjunto de una nueva ubicación del código fuente. Para que funcione, es necesario trabajar con el administrador de control del código fuente para configurar una ubicación separada con los mismos permisos de acceso que la ubicación original del código fuente.

En resumen:
  • Dividimos los recursos para que el conjunto de datos se almacene en otra ubicación del código fuente
  • Los usuarios trabajan como antes, pero sincronizan fragmentos más reducidos con metadatos esenciales del recurso
  • En el caso poco habitual de que necesiten datos del conjunto que no han recibido, los usuarios pueden recuperarlos con solicitarlo
 

¿Cómo se implementan los recursos virtuales?

La función de recursos virtuales está actualmente en fase beta, lo que significa que es un buen momento para probarla, pero que su forma puede cambiar, así que debe usarse con cautela en los proyectos de producción. Sin embargo, nos gustaría destacar que es lo suficientemente sólida como para haber sido usada en la producción de Fortnite desde la temporada 22 en adelante.

Contamos con varios modos de ayudar a los equipos a implementar los recursos virtuales:
Según el tamaño del proyecto y el calendario de producción, será preferible un enfoque u otro. Por ejemplo:
  • Si estás empezando un nuevo proyecto, te recomendamos probar a implementar los recursos virtuales de inmediato.
  • Si tienes un proyecto en plena fase de producción, quizá te convenga no aplicarlos a los recursos o zonas del juego en los que más estés iterando, pero puedes aplicarlo a recursos más grandes en los que no hayas trabajado desde hace mucho tiempo.
  • O puedes simplificar e implementarlos en los recursos de mayor tamaño para virtualizarlos y mantenerlos al alcance de la mano.

Advertencias a tener en cuenta:
  • Aunque aún no hemos implementado un modo de «trabajar sin conexión», somos conscientes de que es una función útil. Es el siguiente punto de nuestra lista y pensamos incluirlo en la versión 5.2. Esto significa que los usuarios que trabajen sin conexión (por ejemplo, en un avión) no podrán utilizar los recursos virtuales a pleno rendimiento en la actualidad. Puede que lleguen a un punto en el que no puedan recuperar datos del conjunto para algo que quieran editar. El editor no debería colgarse, pero necesitarán conectarse para extraer los datos que necesiten del conjunto.
  • Los datos principales se dividen. Aunque no sea un problema durante la producción, uno debe tenerlo en cuenta si planea enviar los datos del contenido del juego fuera de su infraestructura existente. En ese caso, puedes usar la herramienta independiente UnrealVirtualizationTool para devolver los recursos virtualizados a su forma original (volviendo a almacenar el conjunto de datos en el archivo de paquete).
  • Esta implementación solo funciona bien si los usuarios tienen acceso a una memoria caché de datos compartidos con velocidades de conexión razonables. De lo contrario, el usuario notará tirones considerables y le resultará más conveniente tomar por adelantado todo el tiempo y espacio de sincronización. Abordaremos este tema en la siguiente sección.
  • Ahora mismo, la función solo es compatible con el control de código fuente de Perforce.
  • La tecnología sigue en fase beta. Aunque la hemos implementado a nivel interno y estamos trabajando en ella, no podemos asegurar cuándo estarán listos los recursos virtuales en fase de producción ni cuáles serán las compatibilidades de la función en el futuro.
 

¿Son los recursos virtuales una buena opción para mi proyecto?

No hay una respuesta definitiva a si los recursos virtuales se ajustarán a tu proyecto, pues hay muchos factores distintos en juego. Sin embargo, las preguntas que proponemos a continuación te ayudarán a decidir si esta es una solución  apropiada para tu proyecto. También es importante tener en cuenta que la virtualización tiene vuelta atrás. Siempre existe la posibilidad de devolver a su estado inicial cualquier dato virtualizado (o todos) si se desea.
  • ¿Tu equipo tiene actualmente problemas de espacio en disco o consideras que los datos crecerán hasta tal punto que se producirán tales problemas?
  • ¿Los miembros del equipo suelen necesitar sincronizar más de una versión del proyecto y además las distintas versiones comparten gran cantidad de contenido?
  • ¿Los miembros de tu equipo tienen acceso a una buena caché de datos derivados (DDC)?
    • Esta es una pregunta trampa. Si la mayoría de miembros del equipo tienen acceso a una DDC compartida con algunas excepciones, puedes usar recursos virtuales en todo el proyecto y permitir que algunos miembros no los usen. Estos «desvirtualizarán» los recursos al acceder, pero se pueden ejecutar scripts para detectarlos y arreglarlos automáticamente, aunque sea a costa de controlar en exceso las versiones del código fuente.
 

Consejos para aprovechar al máximo los recursos virtuales

  • Recomendamos el uso de procesos de registro del Unreal Editor. De esta forma, se garantiza que los recursos siguen virtualizados al registrarlos. Aunque aportamos herramientas que se pueden utilizar con Perforce para comprobar la virtualización de los recursos, existe la posibilidad de que un usuario se salte este paso.
 

Los recursos virtuales en acción

A menudo, con las funciones que incluimos en Unreal Engine, nos gusta ser nuestros primeros clientes, una práctica llamada «dogfooding». Además de activar los recursos virtuales en productos internos y casos prácticos, también hemos incluido la función en Fortnite. Las cifras que aparecen más adelante son ejemplos ilustrativos para dar una idea del tiempo y el espacio que hemos ahorrado en Fortnite. El aprovechamiento que hagas de la función dependerá del tipo de recursos de tu juego. Por ejemplo, hicimos la prueba con Valley of the Ancient (que no es comparable en absoluto a un juego real), y debido a la gran cantidad de mallas de Nanite, el ahorro dividió el uso de recursos por 50.

En Fortnite, los resultados fueron los siguientes:

Con vistas al futuro

En Unreal Engine 5.1, los recursos virtuales:
  • Funcionan con Perforce
  • Son compatibles con recursos de texturas y audio
  • Se pueden activar de distintos modos (según tipo de recurso, ruta del paquete o en conjunto)
  • Refieren a los datos de conjunto según un hash del contenido del recurso

Tenemos muchas más funciones pensadas para los recursos virtuales, incluyendo:
  • Modo de trabajo sin conexión (para sincronizar todos los datos con antelación)
  • Compatibilidad con más tipos de recursos (como mallas estáticas, incluyendo Nanite)
  • Compatibilidad con otras soluciones de control de código fuente

Y eso es todo. Esperamos que este artículo haya sido de utilidad. Para más información sobre los recursos virtuales, consulta la documentación.

    ¡Hazte con Unreal Engine hoy mismo!

    Hazte con la herramienta de creación más abierta y avanzada del mundo.
    Unreal Engine incluye todas las funciones y acceso ilimitado al código fuente, ¡listo para su uso!