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:
- Obua kullanın
- İstek performans modu "düşük gecikme"
- "Kapsamlı" paylaşım modu isteme
- 48.000 Hz veya Obua örnek hızı dönüştürücüsünü kullanın
- Kullanımı AAUDIO_USAGE_GAME olarak ayarla
- Veri geri aramalarını kullanma
- Geri çağırmadaki işlemleri engellemekten kaçınma
- 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) |