Düşük gecikmeli ses, oyunların daha gerçekçi ve duyarlı olmasını sağlar.
Oyununuzda düşük gecikmeli ses özelliğini etkinleştirmek için aşağıdaki yapılacaklar listesini tamamlayın: Android:
- Obua kullan
- Performans modu "düşük gecikme" isteğinde bulunma
- Paylaşım modunun "özel" olmasını isteme
- 48.000 Hz veya Obua örnek hızı dönüştürücüyü kullanın
- Kullanımı AAUDIO_USAGE_GAME olarak ayarla
- Veri geri çağırmalarını kullanma
- Geri çağırmada işlemleri engellemekten kaçınma
- Arabellek boyutunu "çift arabellek" olarak ayarlama
1. Oboe API'yi kullanma
Oboe API'si, çağrı yapan bir C++ sarmalayıcıdır Android 8.1 (API düzeyi 27) veya sonraki sürümlerde AAudio. Önceki Android sürümlerinde, Oboe, OpenSL ES kullanıyor.
Oboe, GitHub'da veya önceden oluşturulmuş bir ikili program. Oboe ayrıca belirli cihazlardaki sorunları düzelten bir QuirksManager Böylece uygulamanızı daha fazla cihazla uyumlu hale getirir. Obua'yı kullanamıyorsanız Doğrudan sesli arama yapın.
2. Düşük gecikme modu iste
Obua veya AAudio ile düşük gecikme modu isteyin. Aksi takdirde varsayılan olarak ayarlanır.
Obua
builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);
Sesli
AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
3. Münhasır modu isteyin
MMAP arabelleğine özel erişim de isteyebilirsiniz. Uygulamanız erişim sağlar, ancak bu durumda uygulamanız doğrudan erişimi olan bir arabelleğe TTP tarafından okunarak uygulamanıza olası en düşük gecikmeyi sağlar.
Obua
builder.setSharingMode(oboe::SharingMode::Exclusive);
Sesli
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 yapmak için yaklaşık 48.000 Hz alırsınız. Bir örneklem belirtirseniz hızına bağlı olarak, ses çerçevesi verilerinizi farklı bir yolda gönderir. gecikme olabilir.
Farklı bir örnek hızı kullanmanız gerekiyorsa örnek hızını yapmak için Oboe'yu kullanın dönüşüm:
builder->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium);
5. Kullanım alanınızı doğru şekilde bildirin
Uygulamanızın ses çalma nedenini belirtmek, sistemin
doğru yönlendirme, hacim ve performans ayarlarına sahip olmalıdır. Örneğin, oyunlar
Gecikmeden tam olarak yararlanmak için AAUDIO_USAGE_GAME
kullanımını belirtin
özellikle de Bluetooth mikrofonlu kulaklıklara bağlı olduğunda geçerlidir.
Obua
builder.setUsage(oboe::Usage::Game);
Sesli
AAudioStreamBuilder_setUsage(builder, AAUDIO_USAGE_GAME);
6. Geri çağırma işlevi kullanma
Çıkış akışı için bir geri çağırma kullanın. Yazma engelleme özelliğini kullanıyorsanız ve çok fazla gecikme olabilir. daha yüksek olabilir.
Obua
builder.setDataCallback(&myCallbackObject);
Sesli
AAudioStreamBuilder_setDataCallback(builder, &my_callback_proc);
7. Geri çağırmada engelleme yapmaktan kaçının
Düşük gecikmeli bir yayın kullandığınızda geri çağırmalar arasındaki süre çok uzun olabilir. kısa videolar oluşturabilirsiniz. Bu yüzden, önemli ana sayfanın uzun süre engelleyebilecek öğeleri geri çağırmak için kullanır. Geri çağırma seste arabellek alt akışları ve arızalar ortaya çıkar.
Geri çağırma sırasında şunları yapmaktan kaçının:
- Bellek ayırma veya yer açma
- Dosya veya ağ G/Ç
- Eşeksi veya kilit bekleniyor
- Uyku
- Tek seferlik ağır CPU hesaplamaları
olabilir.
8. Arabellek boyutunu ayarlama
Uygulamanız ses akışını açtıktan sonra kullanılabilir arabellek boyutunu ayarlamanız gerekir. kullanabilirsiniz. Obua, arabellek boyutunu otomatik olarak iki seri çekime ayarlar. Ama için varsayılan değer çok daha yüksektir. seri çekim boyutunun iki katına çıkmasına neden olabilir. Seri çekim boyutu, maksimum geri çağırma değeridir seçin.
Ses:
int32_t frames = AAudioStream_getFramesPerBurst() * 2;
AAudioStream_setBufferSizeInFrames(stream, frames);
Arabellek boyutu çok küçükse tampon nedeniyle hatalar yaşayabilirsiniz
eksiktir. Hataların sayısını öğrenmek için
AAudioStream_getXRunCount(stream)
Arabellek boyutunu gerektiği gibi artırın.
Bkz. GitHub Oboe belgeleri arabellekle ilgili terminolojiyi açıklamaya çalışın.
OpenSL İspanyolca
Android'in 8.1'den önceki sürümlerini destekliyorsanız OpenSL ES. Oboe kullanıyorsanız uygulamanızı, daha iyi hale gelecek şekilde yapılandırabilirsiniz gecikme olabilir. Görüntüleyin Optimum gecikmeyi elde etme bölümünü ziyaret edin.
Yapılacaklar listesi sonuçları
Aşağıdaki tabloda Oboe Test Kullanıcısı Gidiş dönüş (girişten çıkışa) gecikmesinin ölçümleri.
Yapılandırma | Gecikme (ms) |
---|---|
Tüm önerileri uygulayın | 20 |
Performans modu düşük gecikmeli değil | 205) |
ÖZEL değil (PAYLAŞILAN) | 26 |
44.100 Hz (ASes) | 160 |
44.100 Hz (Oboe SRC) | 23 |
Çıkış geri çağırma (MMAP) kullanılmıyor | 21 |
Çıkış geri çağırması kullanılmıyor (MMAP değil) | 62 |
Arabellek boyutu maksimum olarak ayarlandı | 53) |