Düşük gecikmeli ses

Düşük gecikmeli ses, oyunları daha gerçekçi ve duyarlı hale getirir.

Android'deki oyununuzda düşük gecikmeli sesi etkinleştirmek için aşağıdaki listeyi tamamlayın:

  1. Obua kullanın
  2. İstek performans modu "düşük gecikme"
  3. "Kapsamlı" paylaşım modu isteme
  4. 48.000 Hz veya Obua örnek hızı dönüştürücüsünü kullanın
  5. Kullanımı AAUDIO_USAGE_GAME olarak ayarla
  6. Veri geri aramalarını kullanma
  7. Geri çağırmadaki işlemleri engellemekten kaçınma
  8. Arabellek boyutunu "çift arabellek" olarak ayarla

1. Oboe API'yi kullanma

Oboe API, Android 8.1 (API düzeyi 27) veya sonraki sürümlerde AAudio desteği veren bir C++ sarmalayıcıdır. Önceki Android sürümlerinde Oboe, OpenSL ES'yi kullanır.

Oboe, GitHub'da veya önceden oluşturulmuş ikili program olarak kullanılabilir. Oboe'nun belirli cihazlardaki sorunları düzelten, uygulamanızı daha fazla cihazla uyumlu hale getiren bir QuirksManager da vardır. Oboe'yu kullanamıyorsanız doğrudan AAudio'yu kullanın.

2. Düşük gecikme modu iste

Oboe veya AAudio ile düşük gecikme modu isteyin. Aksi takdirde, varsayılan olarak daha yüksek bir gecikme modu alırsınız.

Obua

builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);

Ses

AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);

3. Özel mod iste

MMAP arabelleğine özel erişim de isteyebilirsiniz. Uygulamanız özel erişim elde edemeyebilir ancak erişim kazanırsa doğrudan TTP tarafından okunan bir arabelleğe yazar. Bu da uygulamanıza mümkün olan en düşük gecikmeyi sağlar.

Obua

builder.setSharingMode(oboe::SharingMode::Exclusive);

Ses

AAudioStreamBuilder_setSharingMode(builder, AAUDIO_SHARING_MODE_EXCLUSIVE);

4. Örnek oranı dönüşümünü önleme

Cihazın doğal örnek hızını kullanın. Bunu bir örnek hızı belirtmeyerek yapabilirsiniz ve neredeyse 48.000 Hz elde edersiniz. Bir örnek hızı belirtirseniz ses çerçevesi, verilerinizi çok daha yüksek gecikme yaşayabilecek farklı bir yoldan gönderir.

Farklı bir örnek hızı kullanmanız gerekiyorsa örnek hızı dönüşümünü yapmak için Obue'yu kullanın:

builder->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium);

5. Kullanım alanınızı doğru bir şekilde açıklayın

Uygulamanızın ses çalma nedenini belirtmek, sistemin doğru yönlendirme, ses seviyesi ve performans ayarlarını uygulaması için kritik öneme sahiptir. Örneğin, oyunlar, özellikle Bluetooth mikrofonlu kulaklıklara bağlıyken gecikme optimizasyonlarından tam olarak yararlanabilmek için AAUDIO_USAGE_GAME kullanımını belirtmelidir.

Obua

builder.setUsage(oboe::Usage::Game);

Ses

AAudioStreamBuilder_setUsage(builder, AAUDIO_USAGE_GAME);

6. Geri çağırma işlevi kullanma

Çıkış akışı için bir geri çağırma kullanın. Yazmaları engelleme özelliğini kullanıyorsanız ve AAudio MMAP modunu desteklemeyen bir cihazdaysanız gecikme çok daha yüksek olabilir.

Obua

builder.setDataCallback(&myCallbackObject);

Ses

AAudioStreamBuilder_setDataCallback(builder, &my_callback_proc);

7. Geri aramada engelleme yapmaktan kaçının

Düşük gecikmeli bir akış kullandığınızda, geri çağırmalar arasındaki süre çok kısa, sadece birkaç milisaniye olabilir. Bu nedenle, geri aramada uzun süre engellenebilecek hiçbir şey yapmamanız çok önemlidir. Geri çağırma engellenirse seste arabellek alt akışları ve arızalar oluşur.

Geri çağırma işleminde aşağıdakileri yapmaktan kaçının:

  • Bellek ayırma veya boşaltma
  • Dosya veya ağ G/Ç'si
  • Bir mutex (karşılıklı dışlama) veya kilitte bekleniyor
  • Uyku
  • Tek seferlik ağır CPU hesaplamaları

Sorunsuz oynatma için geri çağırmaların matematik işlemini eşit bir hızda yapması gerekir.

8 Arabellek boyutunu ayarla

Uygulamanız ses akışını açtıktan sonra optimum gecikme için kullanılabilir arabellek boyutunu ayarlamanız gerekir. Obua, arabellek boyutunu otomatik olarak iki seri işleme ayarlar. Ancak AAudio için varsayılan değer çok daha yüksektir. Tampon boyutunu seri çekim boyutunun iki katına ayarlayarak çift arabelleğe alma özelliğini kullanın. Seri işlem boyutu, maksimum geri çağırma boyutudur.

Ses Dosyası:

int32_t frames = AAudioStream_getFramesPerBurst() * 2;
AAudioStream_setBufferSizeInFrames(stream, frames);

Tampon boyutu çok küçükse arabellek çalışmalarından kaynaklanan arızalar yaşanabilir. AAudioStream_getXRunCount(stream) numaralı telefonu arayarak hataların sayısını öğrenebilirsiniz. Arabellek boyutunu gerektiği şekilde artırın.

Arabellek ile ilgili terminolojinin açıklaması için GitHub Oboe dokümanlarına bakın.

OpenSL İspanyolca

Android'in 8.1'den önceki sürümlerini destekliyorsanız OpenSL ES'yi kullanmanız gerekir. Oboe kullanıyorsanız uygulamanızı gecikmeyi iyileştirecek şekilde yapılandırabilirsiniz. GitHub belgelerinde Optimum gecikme elde etme bölümüne bakın.

Yapılacaklar listesi sonuçları

Aşağıdaki tabloda, gidiş dönüş (giriş-çıkış) gecikmesi için OboeTester ölçümleri yer almaktadır.

Yapılandırma Gecikme (ms)
Tüm önerileri uygula 20
Performans modu düşük gecikmeli değil 205)
DIŞLAYICI (PAYLAŞILAN) 26
44.100 Hz (AAudio) 160
44100 Hz (Oboe SRC) 23
Çıkış geri çağırma (MMAP) kullanılmıyor 21
Çıkış geri çağırması (MMAP değil) kullanılmıyor 62
Arabellek boyutu maksimum değere ayarlandı 53)