Unity’nin 2019.1.0’daki Android ses gecikmesi iyileştirmesi

Baharatlı haberler! Unity 2019.1.0a7 çıktı ve sürüm notunda sonsuza dek ilk kez “ses gecikmesinden” bahsedildi!

Çok uzun bir süredir, Unity’yi tamamen atlayacak bir eklenti yapmaya karar verdiğim için, ses gecikmesi iyileştirmeleri arayarak tüm yama notlarını dikkatlice okudum. Elbette bu, bir makaleyi hak eden ender bir andır.

Unity ile Android’in sesini tazelemek için, bu konudaki araştırmamla ilgili bir saatlik bu makaleyi tavsiye ettim.

h ortalamasından daha yavaş olduğundan oldukça emin olduğum bir telefon var, Xiaomi Mi A2. Bu telefon kısa süre önce piyasaya sürüldü ve düşük kaliteli bir telefon değil, ancak son derece yüksek Unity ses gecikmesine sahip. (yerel olarak atlandıktan sonra kabul edilebilir ses gecikmesi, muazzam bir 321,2–78,2 = 243 ms fark)

Mi A2 büyük olasılıkla AudioTrack tedavisi görmüş, Unity’nin bu sefer ne gibi iyileştirmeler yaptığını göreceğiz. Ek olarak, test edilecek olan Xperia Z5’e de sahibim, ancak bu telefonun zaten kabul edilebilir bir Unity gecikmesi var.

Özetlemek gerekirse, Native Audio, OpenSL’yi miksersiz tüm telefonlarda zorlar ancak son aşama miksaj için birden fazla OpenSL kanalı kullanır. OpenSL’nin etkin olması durumunda Unity, yalnızca 1 OpenSL parça kullanır, ancak bu parça için uygulama seviyesinden karışık ses akışını birlikte kullanır. Bu, nihai çıktı için yeni bir toplama akışını karıştırmak / oluşturmak zorunda kalmak pahasına Unity’nin içinde çok daha fazla “sanal parça” ile çalışmasına olanak tanır.

Test

Her zaman olduğu gibi, gecikmedeki farkı bulmak için bir “tırnak ses kaydı” testi kullandım. Cihazı aynı konuma konumlandırarak ve ekrana yüksek sesle vurarak, telefondan gelen çivi sesi ve yanıt sesinin en yüksek farkını sabit konumlu bir mikrofona kaydederek çalışır. Unity’nin sesi için ayarlar “En İyi Gecikme” dir.


Sayı, standart bir gecikme ölçümü olmadığı için tek başına hiçbir şey ifade etmez, ancak bu sayının farkı kesinlikle gecikme iyileştirmesidir. Test, kablo bağlanmadan yapılmalıdır çünkü bu statik yük ekler ve rastgele dokunma gecikmesi içerir.

Bu test uygulaması aslında ana sayfada ücretsiz olarak sunulan bir Yerel Ses demosudur, ancak 2019.1 Unity ile oluşturulmuştur. Ne kadar yavaş olduğunu görmek için Java AudioTrack aldığından şüphelendiğiniz bir telefonda deneyebilirsiniz. (Sanırım karşılaştırma için 2019.1 yapımı bir sürümü daha sonra da yüklemeliyim)

Sonuç

Etkileyici! Xiaomi Mi A2’de, önceki Unity versiyonundaki azalma çılgınca bir -200ms! (Unity tamamen yerel olarak atlanırsa, -317 ms)

Xperia Z5’te, telefonun önceki sürümde zaten OpenSL ES kullandığını gösteren anlamlı bir gelişme yok.

İşte her iki telefon için de “android ses özellikleri”.

Xiaomi Mi A2 (Yayınlandı 2018 / Oreo 8.1.0)

Xperia Z5 (2015 / Nougat 7.1.1 Çıktı)

Neler oluyor !?

Elbette sadece sonuçtan tam olarak memnun değilim. Unity’nin bu sefer aldığı yerel ses parçası ayarlarına bakarak öğrenelim. Bu komutu bir kez daha kullanıyoruz:

Unity 2018.3.0b7’nin izi

Bir Unity oyunu açtıktan hemen sonra 1 parça tahsis edildi.


Ancak Unity o kadar akıllı değil. 192 kare sayısı, 48000Hz örnekleme hızı telefonla eşleşen, hızlı izleme etkin olan ilk (iyi) çıkış dizisi şu anda Unity oyunu değil telefonunuzun izi tarafından kullanılıyor. (Unity oyunu olmayan istemci PID 2297 ile onaylandı ve bazı sesler çalmaya çalışsam da aktif “hayır” durumu)

Ancak Unity’nin izi, 1920 kare sayısıyla (10x!), parçayla şüpheli bir şekilde eşleşmeyen örnekleme hızıyla ( SRate 24000 ) başka bir ileti dizisinde sona erdi ve ileti dizisi AUDIO_OUTPUT_FLAG_DEEP_BUFFER çift. Bu bayrak, güç tasarrufu özelliği ile ilgilidir, düşük gecikmenin tam tersidir. Bu sonuç, önceki araştırma makalemle aynı.

Unity 2019.1.0a7’nin yolu

Bir Unity oyununu açtıktan hemen sonra 1 parça tahsis edildi. Ama bu sefer Unity doğru anladı! Parça, telefonun varsayılan iziyle birlikte ve "F", hızlı izlemenin etkinleştirildiğini gösterir. Bu, OpenSL ES'nin doğru şekilde etkinleştirildiğinin işareti olmalıdır.

Yerel Ses 2 parça daha eklediğinde:

Hey! Artık hem Yerel Ses başlatılmış parçamın hem de Unity'nin parçasının aynı çıktı dizisinde olduğunu görüyorsunuz. Örnekleme oranı 24000 değil, doğru 48000'dir. Unity'nin Mi A2 telefonu için Yerel Ses, telefon ve diğer herkes için tam olarak en iyi kurulumu izlediğini belirtir.

Hem Unity hem de Native Audio şu anda eşit yerel performansa sahip, önceki bölümden gördüğünüz gecikme süresinin tek farkı uygulama seviyesindedir; bu, oyunun motorun mikser veri yolları ve efektler rahatlığını istiyorsak kaçınılmazdır.

İz somutlaştırma rutininde olası bir değişiklik

Bir defasında, forumda Unity ekip üyesiyle Android’in ses gecikmesi hakkında konuştum:

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

% 100 güvenli olmak Unity'nin c̶o̶m̶p̶l̶e̶t̶e̶l̶y̶ cihazından bildirilen "Düşük Gecikme Özelliği" ve "Pro Ses Özelliği" bayrağına güvendiğini öğrendik (* düzenleme: tamamen değil, başka faktörler de var OpenSL ES veya Java AudioTrack kullanmaya karar vermek için https://forum.unity.com/threads/unitys-android-audio-latency-improvement-in-2019-1-0.577594/#post-3848590). Ve Mi A2'de görebilirsiniz, her ikisi de yanlıştır.

Bu arada, her ikisinde de geçerli olan Xperia Z5, 2019.1 öncesi tüm Unity sürümlerinden "akıllı" bir 2019.1.0a7 davranışı sergiliyor. Ayrıca başlatma rutininin muhtemelen yalnızca bu işaretlere dayandığını doğrulayın.

Ancak bu işaretler donanım performansına veya herhangi bir şeye dayanmaz, yalnızca telefonun Google'ın gereksinimini karşıladığını düşündükten sonra üretici tarafından manuel olarak ayarlanan bir boole değeridir. Telefon ses gecikmesi konusunda gerçekten iyi durumdaysa ancak üretici bayrağı Mi A2 gibi ayarlamadıysa, Unity'den telefonun başka bir yerinde gecikmenin iyi göründüğü korkunç bir gecikme yaşarsınız.

2019.1 sürümünde tahmin ediyorum, Unity sonunda bayrak false döndürse bile OpenSL ES kullanmaya karar verebilir * düzenleme: Asıl yeni gereksinim şu ki, tampon boyutu 192 artık ne olursa olsun OpenSL alacak bayrağın https://forum.unity.com/threads/unitys-android-audio-latency-improvement-in-2019-1-0.577594/#post-3848590, ancak bunun yine de riskli bir değişiklik olduğunu söyledi. Yury, “Yakında işleri daha iyi hale getirmeye çalışıyoruz! En iyi çalışanlarımız işin içinde. " ve sonra gerçekten burada. Sıkı çalışma için teşekkürler!

Özet

Tüm ritim oyunu geliştiricilerinin mümkün olan en kısa sürede 2019.1'e yükseltmelerini tavsiye ederim, çünkü bu Xiaomi cihazları düşük fiyatı nedeniyle oldukça yaygın. Dışarıdaki hangi cihazların, düşük gecikmeyi gerçekten kaldırabildiğinde yanlış düşük gecikmeli özellik işaretini bildirdiğini kim bilebilir?

Ses gecikmesi hakkında daha fazla tartışmak isterseniz, Discord kanalım # native-audio'da benzer düşünenlere (bu küçük zamanları önemseyenler) katılabilirsiniz. Geri kaydırırsanız, tüm ritim oyunu geliştirici arkadaşları sayesinde şimdiden oldukça hararetli ve yapıcı tartışmalar görebilirsiniz!