100 avatares en una pestaña del navegador: optimizaciones de representación para grandes eventos y más

Esta publicación se publicó originalmente en Decentraland

Introducción

El Metaverse Festival tenía que ser un hito en la historia de la plataforma y la experiencia del usuario tenía que estar a la altura: mejorar el rendimiento de renderizado de los avatares era clave.

Cuando comenzó la planificación del Festival Metaverse, solo se podían generar 20 avatares alrededor del jugador al mismo tiempo, y si se mostraban todos en la pantalla al mismo tiempo, el rendimiento se degradaría significativamente. Ese límite se debió a las limitaciones de representación del navegador web y al antiguo protocolo de comunicación, que luego se mejoró con la nueva solución Archipelago. Esto no proporcionaría una experiencia de festival social realista para los usuarios, por lo que los colaboradores de Decentraland concluyeron que necesitaban aumentar la cantidad de usuarios que podían verse en la pantalla para que el festival tuviera éxito.

Los colaboradores de Explorer comenzaron probando una teoría: que Rendición (junto con el despellejamiento de la CPU) fue el principal culpable de los problemas de rendimiento causados ​​por tener múltiples avatares en la pantalla. La teoría se confirmó después de perfilar el desempeño con 100-200 robots avatar en un entorno controlado.

Ante estos resultados, el objetivo era aumentar la vista máxima de avatar de 20 a 100. Se hicieron tres esfuerzos para lograrlo.

  1. un nuevo sistema impostor fue presentado. Este sistema evita renderizar y animar avatares distantes reemplazándolos con una sola cartelera similar cuando sea necesario.
  2. A disfraz Revestimiento de GPU se implementó la implementación, lo que redujo de manera efectiva los cuellos de botella relacionados con el desollado de la CPU por un margen enorme.
  3. El La canalización de representación de avatares se ha vuelto a implementar desde cero, reduciendo las llamadas de extracción en alrededor de 10+ aa llamada de sorteo único a lo mejor. Las combinaciones complejas de dispositivos portátiles podrían aumentar ligeramente el recuento de llamadas extraídas debido al cambio de estado de procesamiento, pero en el peor de los casos no superaría las tres o cuatro llamadas.

Según las pruebas comparativas, estos esfuerzos combinados mejoraron el rendimiento de representación del avatar en aproximadamente 180%. Este es el primero de muchos esfuerzos para preparar la plataforma para eventos masivos como el Festival Metaverse, al que asistieron más de 20,000 personas.

impostores de avatares

Después de implementar una herramienta de generación de robots avatar y una herramienta de creación de perfiles de rendimiento en el navegador web, los colaboradores estaban listos para tomar esos datos de creación de perfiles y crear el sistema impostor de avatares.

Mientras se hacían grandes escenas antes del festival, se creó una escena con fines de prueba. Contenía algunos factores deseados para el medio ambiente: una estructura tipo estadio, algunos objetos constantemente actualizados, y al menos dos diferentes fuentes de transmisión de video. Todo esto se hizo usando Decentraland SDK.

Con todo lo demás en su lugar, ha comenzado la prueba de concepto para impostores de avatares.

Después de hacer la lógica básica, los colaboradores comenzaron a trabajar en la «parte visual» de la función.

Primero un Atlas de sprites con impostores predefinidos se utilizó para aleatorizar impostores para cada avatar.

Posteriormente, se realizaron varios experimentos utilizando instantáneas capturadas en tiempo de ejecución con el ángulo de cada avatar hacia la cámara. Sin embargo, la manipulación de texturas en tiempo de ejecución en el navegador demostró ser extremadamente pesada en rendimiento, por lo que se descartó esa opción.

Eventualmente, la instantánea del cuerpo de los usuarios que ya existía en los servidores de contenido se usó para su impostor, y el atlas de sprites predeterminado se aplicó para bots o usuarios sin perfil.

Por último, pero no menos importante, se han implementado y cambiado algunos efectos finales relacionados con la posición y la distancia.

Las escenas ocupadas como Wondermine demostraron ser invaluables cuando se probaron con usuarios reales.

👉 Las contribuciones del sistema impostor son públicas y están disponibles en los siguientes PR (1, 2, 3, 4)

Revestimiento de GPU

La implementación de Unity de skinning para el destino WebGL/WASM obliga a que los cálculos de skinning estén en el subproceso principal, y también carece de todas las mejoras de SIMD que se encuentran en otras plataformas. Cuando se renderizan muchos avatares, esta sobrecarga se acumula y se convierte en un problema de rendimiento, ocupando hasta el 15 % del tiempo de cuadro (¡o más!) cuando se intenta renderizar varios avatares.

En la mayoría de las implementaciones de skinning de GPU descritas en Internet, los datos de animación se empaquetan en texturas y luego se introducen en el sombreador de skinning. Esto es bueno para el rendimiento en papel, pero tiene sus limitaciones. Por ejemplo, fusionar animaciones es complicado, además de tener que escribir su propio animador personalizado para manejar el tablero de animación.

Dado que el aspecto está tan mal optimizado en el objetivo WASM, los colaboradores descubrieron que se puede observar una mejora del rendimiento de ~ 200 % incluso sin empaquetar datos de animación en texturas. Esto significa que una implementación simplista que simplemente carga las matrices óseas en un shader de skinning por cuadro es suficiente. Esta optimización se ha mejorado aún más, ya que las animaciones más lejanas son limitadas y no cargan sus matrices óseas en cada cuadro. En general, este enfoque le dio a los avatares un impulso en el rendimiento, evitó reescribir el sistema de animación de Unity y mantuvo la compatibilidad con la combinación de estados de animación.

El piel de GPU reducida se puede ver en acción en los avatares más lejanos en estos videos en el Festival Metaverse:

👉 Las contribuciones al aspecto GPU son públicas y están disponibles en los siguientes PR (1, 2, 3, 4).

Representación revisada de avatares.

Los avatares se renderizaron como una serie de diferentes renderizadores de malla con piel que compartían sus datos óseos. Además, algunos dispositivos portátiles necesitaban un material separado para tener en cuenta el color de la piel y la emisión. Esto significaba que algunos dispositivos portátiles necesitaban dos o tres sorteos. En este escenario, tener que dibujar un avatar completo podría resultar en más de 10 sorteos. Las llamadas de minería son muy costosas en WebGL, fácilmente comparables con el costo de las llamadas de extracción de GPU móvil, o incluso peor. Al realizar una evaluación comparativa con más de 20 avatares en la pantalla, la velocidad de fotogramas comenzó a disminuir considerablemente.

La nueva canalización de representación de avatares funciona fusionando todas las primitivas portátiles en una sola malla, codificando la muestra y los datos uniformes en el flujo de vértices de una manera que también permite empaquetar cada uno de los dispositivos portátiles en uno.

Quizás se pregunte cómo se empaquetan las texturas de los dispositivos portátiles. Dado que los dispositivos portátiles son dinámicos por naturaleza, carecen de la ventaja del atlas y el intercambio de texturas entre ellos es escaso, casi inexistente. Las optimizaciones más obvias son:

  • Empaquetado de todas las texturas en un atlas generado en tiempo de ejecución.
  • Usando una matriz de texturas 2D y poniendo todas las texturas portátiles en tiempo de ejecución.

El problema con estos enfoques es que generar y copiar píxeles de textura en tiempo de ejecución es muy costoso debido al cuello de botella de memoria CPU-GPU. El enfoque de la matriz de texturas tiene otra limitación: sus elementos de textura no pueden referirse simplemente a otras texturas, deben copiarse y todas las texturas de la matriz deben tener el mismo tamaño.

Además, la creación de una nueva historia para cada avatar requiere mucha memoria y el montón del cliente actual está limitado a 2 GB debido a las limitaciones de emscripten; se puede ampliar a 4 GB, pero solo a partir de Unity 2021 en adelante, ya que han actualizado emscripten en esa versión. Dado que el objetivo de los contribuyentes era admitir al menos cien avatares al mismo tiempo, esta no era una opción.

Para evitar los problemas de copiar texturas por completo, se ha adoptado un enfoque más simple pero más eficiente.

En el sombreador de avatar, un conjunto de muestras de texturas utiliza 12 ranuras de muestreo permitidas para las texturas de avatar. Durante el renderizado, la muestra necesaria se indexa utilizando datos UV personalizados. Estos datos están organizados de tal manera que los gráficos de albedo y emisión se identifican utilizando los diferentes canales UV. Este enfoque permite un envasado muy eficiente. Por ejemplo, el mismo material podría usar 6 albedo y 6 texturas emisivas, o 11 albedo y una sola emisiva, y así sucesivamente. El combinador de avatar se aprovecha de esto e intenta empaquetar todos los dispositivos portátiles utilizados de la manera más eficiente posible, la contrapartida es que se debe usar la bifurcación en el código de sombreado, pero el rendimiento de los fragmentos no es un problema, por lo que los retornos de la inversión son extremadamente positivos.

Imagen superior, antes de la mejora (120ms/8FPS). Imagen inferior, posterior (50ms/20FPS).

👉 Las contribuciones de representación de avatares son públicas y están disponibles en los siguientes PR (1, 2)

Conclusión

Después de estas mejoras, un aumento de rendimiento de 180% (un promedio de 10 FPS a un promedio de 28 FPS) se observó con 100 avatares en la pantalla.

Algunas de estas mejoras, como la reducción de la apariencia de GPU, pueden aplicarse a otras mallas animadas dentro de Decentraland en el futuro.

Estos esfuerzos masivos para permitir 5 veces más avatares en pantalla (20 a 100) para el Festival ahora son parte del explorador Decentraland para siempre y continuarán agregando valor a las experiencias sociales en todo el mundo.

Apóyanos a través de nuestros patrocinadores

Artículo anteriorIOTA elegida por la Unión Europea para desarrollar soluciones Blockchain
Artículo siguienteVisa trabaja con Consensys para construir una infraestructura de pago para CBDC

Dejar respuesta

Please enter your comment!
Please enter your name here