Mejora de la latencia de audio de Android de Unity en 2019.1.0

¡Noticias picantes! Aparece Unity 2019.1.0a7 y en la nota de la versión, por primera vez en la vida, se menciona la “latencia de audio”.

Durante mucho tiempo, he estado leyendo todas las notas del parche cuidadosamente buscando mejoras en la latencia de audio, pero decidí crear un complemento para omitir Unity por completo. Este es un raro momento que merece un artículo, seguro.

Para un repaso sobre el audio de Android con Unity, le recomendé este artículo de una hora sobre mi investigación al respecto.

Tengo un teléfono que h estoy bastante seguro de que es más lento que el promedio, el Xiaomi Mi A2. Este teléfono se lanzó recientemente y no es un teléfono de gama baja, pero con una latencia de audio de Unity extremadamente alta. (latencia de audio aceptable una vez que se pasa a nativo, una enorme diferencia de 321,2–78,2 = 243 ms)

El Mi A2 probablemente recibió tratamiento AudioTrack, veremos qué mejora tiene Unity esta vez. Además, todavía tengo el Xperia Z5 que también se probará, pero ese teléfono ya tiene una latencia Unity aceptable.

Para recapitular, Native Audio fuerza OpenSL en todos los teléfonos sin mezclador, pero utiliza múltiples pistas OpenSL para la mezcla de última etapa. Unity en el caso de OpenSL habilitado, usa solo 1 pista de OpenSL pero transmisión de audio mezclada desde el nivel de la aplicación para esa pista. Esto permite trabajar con muchas más “pistas virtuales” dentro de Unity a expensas de tener que mezclar / crear una nueva secuencia de suma para la salida final.

La prueba

Como de costumbre, utilicé una prueba de “grabación de sonido de uñas” para averiguar la diferencia de latencia. Funciona colocando el dispositivo en la misma posición y golpeando la pantalla con fuerza, registrando la diferencia máxima del sonido de la uña y el audio de respuesta que proviene del teléfono que va a un micrófono de posición fija. La configuración del audio de Unity es “Mejor latencia”.


El número por sí solo no significa nada, ya que no es una medida de latencia estándar, pero la diferencia de este número es definitivamente la mejora de la latencia. La prueba debe realizarse sin conectar el cable porque eso agrega carga estática e incluye aleatoriamente la latencia táctil.

Esa aplicación de prueba es en realidad una demostración de Native Audio disponible de forma gratuita en la página de inicio, pero se creó con Unity anterior a 2019.1. Puede probarlo en algún teléfono que sospeche que está obteniendo Java AudioTrack para ver qué tan lento es. (Supongo que debería subir una versión construida en 2019.1 más adelante también para comparar)

Resultado

¡Impresionante! ¡En el Xiaomi Mi A2, la reducción de la versión anterior de Unity es una locura -200ms! (Si se saltó Unity por completo a nativo, -317ms)

En el Xperia Z5 no hay una mejora significativa, lo que indica que el teléfono ya está usando OpenSL ES en la versión anterior.

Estas son las “especificaciones de audio de Android” para ambos teléfonos.

Xiaomi Mi A2 (lanzado en 2018 / Oreo 8.1.0)

Xperia Z5 (lanzado en 2015 / Nougat 7.1.1)

¿¡Qué está pasando !?

Por supuesto, no estoy completamente satisfecho con el resultado. Vamos a averiguarlo examinando la configuración de la pista de audio nativa que obtuvo Unity esta vez. Una vez más usamos este comando:

Pista de Unity 2018.3.0b7

Inmediatamente después de abrir un juego de Unity, se ha asignado 1 pista.


Pero Unity no es tan inteligente. El primer hilo de salida (bueno) con 192 cuadros, una frecuencia de muestreo de 48000 Hz que coincide con el teléfono, la vía rápida habilitada está actualmente ocupada por la pista de su teléfono y no por el juego Unity. (Confirmado con el cliente PID 2297, que no es un juego de Unity y su estado activo es “no” aunque intenté reproducir algo de audio)

Pero la pista de Unity terminó en otro hilo con un enorme recuento de 1920 fotogramas (¡10x!), la frecuencia de muestreo sospechosamente no coincide con la pista ( SRate 24000 ), y el hilo obtuvo AUDIO_OUTPUT_FLAG_DEEP_BUFFER incluso. Esta bandera está relacionada con la función de ahorro de energía, es todo lo contrario a la baja latencia. Este resultado es el mismo que en mi artículo de investigación anterior.

Pista de Unity 2019.1.0a7

Inmediatamente después de abrir un juego de Unity, se ha asignado 1 pista. ¡Pero esta vez Unity lo hizo bien! La pista está junto con la pista predeterminada del teléfono con "F" que indica que se ha habilitado la vía rápida. Esta debe ser la señal de que OpenSL ES está habilitado correctamente.

Cuando Native Audio agrega 2 pistas más:

¡Oye! Ahora ves que tanto mi pista instanciada de Native Audio como la pista de Unity están en el mismo hilo de salida. La frecuencia de muestreo no es 24000, sino 48000 correctamente. Indica que Unity está siguiendo exactamente la mejor configuración para el teléfono Mi A2, alineado con Native Audio, y el teléfono, y todos los demás.

Tanto Unity como Native Audio tienen el mismo rendimiento nativo ahora, la única diferencia de tiempo de latencia que ves en la sección anterior está en el nivel de la aplicación, lo cual es inevitable si queremos la conveniencia del motor del juego de buses mezcladores y efectos.

Un posible cambio en la rutina de instanciación de pistas

Una vez, hablé en el foro con un miembro del equipo de Unity sobre la latencia de audio de Android:

https://forum.unity.com/threads/android-sound-problem.359341/page-3#post-3638170

Aprendimos que para estar 100% seguro Unity está confiando en el indicador "Función de baja latencia" y "Función de audio profesional" informados desde el dispositivo c̶o̶m̶p̶l̶e̶t̶e̶l̶y̶ (* editar: no completamente, hay otros factores https://forum.unity.com/threads/unitys-android-audio-latency-improvement-in-2019-1-0.577594/#post-3848590) para decidir utilizar OpenSL ES o Java AudioTrack. Y puedes ver en Mi A2, ambos son falsos.

Por cierto, Xperia Z5 que tiene true en ambos exhibe un comportamiento "inteligente" 2019.1.0a7 de cualquier versión de Unity antes de 2019.1. Confirme además que la rutina de inicialización probablemente se basó solo en estos indicadores.

Sin embargo, estas marcas no se basan en el rendimiento del hardware ni nada, es solo un valor booleano establecido manualmente por el fabricante después de que creen que el teléfono pasó el requisito de Google. Si el teléfono tiene una latencia de audio decente, pero el fabricante no estableció la marca como el Mi A2, entonces obtienes una latencia horrible de Unity, donde en algún otro lugar del teléfono la latencia parece estar bien.

Supongo que en la versión 2019.1, Unity finalmente puede decidir usar OpenSL ES incluso si la bandera devuelve false * editar: El nuevo requisito real es que el tamaño del búfer ≤ 192 ahora obtendrá OpenSL independientemente de la bandera https://forum.unity.com/threads/unitys-android-audio-latency-improvement-in-2019-1-0.577594/#post-3848590 pero dijo que esto sigue siendo un cambio arriesgado. Yury dijo: “¡Estamos buscando mejorar las cosas pronto! Nuestra mejor gente está en eso ". y luego está realmente aquí. ¡Gracias por el arduo trabajo!

Resumen

Recomiendo a todos los desarrolladores de juegos de ritmo que se actualicen a 2019.1 lo antes posible, ya que estos dispositivos Xiaomi están bastante extendidos por su bajo precio. ¿Quién sabe qué dispositivos reportan false marca de función de baja latencia cuando en realidad puede manejar baja latencia?

Si desea discutir más sobre la latencia de audio, siéntase libre de unirse a personas de ideas afines (aquellos que se preocupan por estos pequeños momentos) en mi canal de Discord # native-audio. Si te desplazas hacia atrás, ya puedes ver bastantes discusiones acaloradas y constructivas gracias a todos los amigos desarrolladores de juegos de ritmo.