Mejora tu juego con Burst 1.7

TIM JONES / UNITY TECHNOLOGIESSenior Software Engineer
Mar 14, 2022|9 minutos
Mejora tu juego con Burst 1.7
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.

La última versión del paquete Ráfaga incluye grandes mejoras tanto en el tiempo de iteración como en el Inspector de Ráfagas. En esta entrada, veremos qué ha cambiado y cómo nuestra tecnología de compilador de C# de alto rendimiento (HPC#) puede ayudarle ahora a mejorar el rendimiento en todas las plataformas con mayor facilidad.

Mientras que nuestra pila de tecnología DOTS aprovecha Burst para proporcionar código altamente optimizado, Burst es un paquete independiente, disponible en el Gestor de paquetes para Unity 2019.4 o posterior. Miles de sus proyectos en las principales plataformas de sobremesa, consolas y móviles ya aprovechan las ventajas de Burst.

Iterar en tiempo de iteración

En versiones anteriores de Burst, hemos dado pasos significativos en la mejora de la experiencia diaria de trabajar con Burst. En Burst 1.7, hemos continuado esa tendencia centrándonos en mejorar el tiempo de iteración. ¿Qué entendemos por tiempo de iteración? Nos referimos al "bucle interno" del desarrollo: usted realiza un cambio en un script de C#, vuelve al Editor, espera a que termine la compilación del script, espera a que termine la compilación de Burst y, a continuación, entra en el modo Play para probar su cambio.

En Burst 1.7, hemos reducido drásticamente la cantidad de tiempo que te encontrarás esperando a Burst, para el escenario común de hacer algunos cambios en el código de tu juego y probarlo en el modo Jugar. Ahora, la compilación en ráfaga se produce antes en la canalización (inmediatamente después de que la canalización de compilación de secuencias de comandos haya terminado de compilar los ensamblados .NET), de modo que, en muchos casos, ya ha finalizado cuando es necesario ejecutar el código resultante. En lugar de compilar cada punto de entrada de Burst por separado, como ocurría en versiones anteriores de Burst, los puntos de entrada de Burst (por ejemplo, un job o un puntero de función) se agrupan ahora por lotes para mejorar el rendimiento del compilador y reducir el número de bibliotecas que el Editor debe cargar.

Burst 1.7 también incluye una importante mejora del rendimiento de las llamadas directas. La llamada directa es una función que añadimos en Burst 1.5 y que permite al código C# gestionado llamar directamente a un método compilado por Burst, sin pasar por BurstCompiler.CompileFunctionPointer. Durante la recarga de un dominio, es necesario realizar cierto trabajo de inicialización para cablear los métodos de llamada directa y, en Burst 1.7, hemos conseguido que esta inicialización sea hasta 33 veces más rápida.

Como última nota sobre el tema del tiempo de iteración, examinamos el coste de la inicialización de SharedStatic. SharedStatic es un mecanismo que permite compartir datos entre managed C# y HPC#. En Burst 1.7, hemos hecho la inicialización de SharedStatic hasta 13 veces más rápida.

Los siguientes gráficos muestran las mejoras de rendimiento en Burst 1.7, en comparación con Burst 1.6. Las mediciones se realizaron en un gran proyecto de un cliente. El primer gráfico a continuación muestra los tiempos tomados con un cronómetro (un cronómetro real, no System.Diagnostics.Stopwatch) observando el Editor, por lo que deberían reflejar el tipo de mejoras que puede esperar ver en el uso diario.

Mejoras de rendimiento en Burst 1.7

El segundo gráfico a continuación sólo se centra en la Ráfaga, por lo que excluye cualquier otra cosa que pueda estar ocurriendo en el Editor. Para este proyecto concreto y este archivo modificado, la Ráfaga 1.7 es más rápida que la Ráfaga 1.6 en los tres tiempos:

  • Caché en frío - Burst aún no ha almacenado en caché ningún resultado de compilación para el código de su proyecto.
  • Caché en caliente - Burst ya ha compilado el código de su proyecto y necesita cargar los resultados de la compilación en caché desde el disco.
  • Cambiar un archivo - Después de cambiar un archivo, Burst comprueba qué puntos de entrada necesitan ser recompilados y los compila. Tenga en cuenta que la cantidad de mejora en Burst 1.7 depende, en general, del archivo que se modifique. Por ejemplo, si cambia un método que utilizan todos los puntos de entrada de Burst, la diferencia entre Burst 1.6 y Burst 1.7 será menor. En este ejemplo, se ha modificado el propio método del punto de entrada.
Mejoras en el rendimiento de Burst 1.7 2
Inspector de ráfagas

El Inspector de Ráfagas (accesible a través de Trabajos > Ráfagas > Abrir Inspector...) es una herramienta increíblemente útil para el trabajo de optimización. Con esta herramienta, puede ver el código ensamblador que se ejecutará en la(s) CPU(s) de destino. En Burst 1.7 hemos añadido varias funciones muy solicitadas. Una captura de pantalla dice más que mil palabras, así que sin más preámbulos:

Marcadores de rama del inspector de ráfagas

Como puede ver, hemos añadido marcadores de bifurcación para facilitar la visualización de las rutas de ejecución del código. Tenga en cuenta que los marcadores de bifurcación pueden desactivarse con la casilla "Mostrar flujo de bifurcación" para que no estorben cuando no los necesite. Un aspecto especialmente agradable de esta función es que puedes hacer clic en una flecha de flujo de ramas y saltarás al otro extremo de la flecha, así:

Ejemplo de clic en el marcador de bifurcación para saltar al destino de la bifurcación

Los bloques de desensamblado menos importantes (p. ej., directivas o datos constantes) ahora se contraen automáticamente, pero aún pueden activarse cuando se desee verlos.

Otra novedad de Burst 1.7 es la posibilidad de seleccionar sólo una sección del desmontaje y copiarla.

Ejemplo de selección y copia de una sección específica del desmontaje

Mejoras varias

He aquí una lista de pequeñas pero no menos importantes mejoras de Burst 1.7.

  • Las APIs Arm Neon vst1* son ahora totalmente compatibles. Añadimos estas APIs en Burst 1.6, pero las guardamos detrás de una #define experimental. En Burst 1.7, ya no están protegidos tras esa #define y son totalmente compatibles.
  • System.Span<T> y System.ReadOnlySpan<T> ahora son compatibles con el código Bursted. Estos tipos no están permitidos como argumentos de punto de entrada.
  • Burst ahora utiliza LLVM Versión 12.0.0 por defecto, aportando las últimas mejoras de optimización del proyecto LLVM.
  • Hemos cambiado el proceso de optimización de LLVM para ejecutar el desenrollador de bucles exclusivamente después del vectorizador de bucles. Esto mejora el codegen en muchos casos.
  • Hemos hecho que fmod y el módulo de coma flotante utilicen un algoritmo más rápido para mejorar el rendimiento.
  • Burst ahora genera un link.xml automáticamente para evitar la eliminación de IL, causando símbolos faltantes en tiempo de ejecución por el uso de constructores estáticos.
  • Hemos mejorado el rendimiento del compilador al realizar copias de estructuras grandes detectando más casos en los que una operación de carga/almacenamiento puede convertirse de forma segura en una operación de movimiento de memoria.
  • Hemos modificado el modo en que se muestran los tiempos cuando la opción "Mostrar tiempos" está activada en el menú Ráfaga. Depurando y presentando la información de forma más clara.
El futuro de Burst

Ten en cuenta que Burst 1.7 es la última versión compatible con Unity 2019.4. La próxima versión de Burst tendrá como requisito mínimo Unity 2020.3. Si tienes alguna idea, pregunta o simplemente quieres contarnos lo que haces con Burst, no dudes en dejarnos un mensaje en el foro de Burst.