Düşük gecikmeli ses

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:

  1. Obua kullan
  2. Performans modu "düşük gecikme" isteğinde bulunma
  3. Paylaşım modunun "özel" olmasını isteme
  4. 48.000 Hz veya Obua örnek hızı dönüştürücüyü kullanın
  5. Kullanımı AAUDIO_USAGE_GAME olarak ayarla
  6. Veri geri çağırmalarını kullanma
  7. Geri çağırmada işlemleri engellemekten kaçınma
  8. 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)