Audio mit niedriger Latenz

Audioinhalte mit niedriger Latenz sorgen dafür, dass sich Spiele realistischer und reaktionsschneller anfühlen.

Gehen Sie die folgende Checkliste durch, um Audio mit niedriger Latenz in Ihrem Spiel zu aktivieren: Android-Geräte:

  1. Oboen verwenden
  2. Anfrageleistungsmodus mit niedriger Latenz
  3. Freigabemodus „exklusiv“ anfordern
  4. 48.000 Hz oder den Oboen-Abtastratenkonverter verwenden
  5. Nutzung auf AAUDIO_USAGE_GAME festlegen
  6. Daten-Callbacks verwenden
  7. Blockierung von Vorgängen im Callback vermeiden
  8. Puffergröße auf „double buffer“ anpassen

1. Oboe API verwenden

Die Oboe API ist ein C++-Wrapper, der AAudio auf Geräten mit Android 8.1 (API-Level 27) oder höher. Bei älteren Android-Versionen Oboe verwendet OpenSL ES.

Oboe ist auf GitHub oder als Eine vordefinierte Binärdatei. Oboe hat auch einen QuirksManager, der Probleme auf bestimmten Geräten, Dadurch ist deine App mit mehr Geräten kompatibel. Wenn Sie Oboe nicht verwenden können, verwenden Sie AAudio direkt.

2. Modus für geringe Latenzzeit anfordern

Fordere bei Oboe oder AAudio den Modus mit niedriger Latenz an. Andernfalls erhalten Sie eine höhere Latenzmodus aktiviert.

Oboen

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

Audio

AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);

3. Exklusiven Modus anfordern

Sie können auch exklusiven Zugriff auf den MMAP-Zwischenspeicher anfordern. Deine App erhält möglicherweise exklusiven Zugriff erhalten. Wenn dies der Fall ist, schreibt Ihre App direkt in einen Zwischenspeicher, wird von der DSP gelesen, wodurch Ihre App die geringstmögliche Latenz erhält.

Oboen

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

Audio

AAudioStreamBuilder_setSharingMode(builder, AAUDIO_SHARING_MODE_EXCLUSIVE);

4. Umwandeln der Abtastrate vermeiden

Verwenden Sie die natürliche Abtastrate des Geräts. Sie können dazu keine Abtastrate und Sie erhalten mit ziemlicher Sicherheit 48.000 Hz. Wenn Sie eine Stichprobe angeben, sendet das Audio-Framework Ihre Daten über einen anderen Pfad, viel höhere Latenz.

Wenn Sie eine andere Abtastrate verwenden müssen, nutzen Sie Oboe, um die Abtastrate festzulegen. Conversion:

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

5. Anwendungsfall richtig deklarieren

Du musst angeben, warum deine App Audioinhalte wiedergibt, damit das System sie anwenden kann Einstellungen für Routing, Volumen und Leistung anpassen. Spiele sollten beispielsweise Geben Sie die Nutzung AAUDIO_USAGE_GAME an, um die Latenz optimal zu nutzen optimiert werden, besonders wenn Bluetooth-Headsets angeschlossen sind.

Oboen

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

Audio

AAudioStreamBuilder_setUsage(builder, AAUDIO_USAGE_GAME);

6. Callback-Funktion verwenden

Verwenden Sie einen Callback für den Ausgabestream. Wenn Sie blockierende Schreibvorgänge verwenden und ein Gerät, das den AAudio-MMAP-Modus nicht unterstützt, kann die Latenz höher liegen.

Oboen

builder.setDataCallback(&myCallbackObject);

Audio

AAudioStreamBuilder_setDataCallback(builder, &my_callback_proc);

7. Blockierung im Callback vermeiden

Wenn du einen Stream mit niedriger Latenz verwendest, kann die Zeit zwischen den Callbacks sehr groß sein. nur wenige Millisekunden. Es ist also sehr wichtig, was lange blockiert werden könnte. Wenn der Callback blockiert sind, treten Pufferunterläufe und Störungen im Audio auf.

Vermeiden Sie bei einem Callback Folgendes:

  • Arbeitsspeicher zuweisen oder freigeben
  • Datei- oder Netzwerk-E/A
  • Warten auf Stummschaltung oder Sperre
  • Schlaf
  • Komplexe einmalige CPU-Berechnungen

Die Callbacks sollten die Berechnungen in gleichmäßigem Tempo durchführen, Störungen.

8. Puffergröße abstimmen

Sobald Ihre App den Audiostream öffnet, müssen Sie die verwendbare Puffergröße einstellen. für eine optimale Latenz. Oboe legt die Puffergröße automatisch auf zwei Bursts fest. Aber mit AAudio ist die Standardeinstellung viel höher. Verwenden Sie die doppelte Zwischenspeicherung, indem Sie den Parameter auf die doppelte Burst-Größe. Die Burst-Größe ist die maximale Callback-Größe. Größe.

AAudio:

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

Wenn der Zwischenspeicher zu klein ist, treten möglicherweise durch Puffer verursachte Fehler auf. Unterlauf. Sie können die Anzahl der Störungen ermitteln, indem Sie AAudioStream_getXRunCount(stream) Erhöhen Sie die Puffergröße nach Bedarf.

Weitere Informationen finden Sie in der GitHub-Oboen-Dokumentation finden Sie eine Erläuterung der pufferbezogenen Terminologie.

OpenSL (Spanisch)

Wenn Sie eine ältere Version als Android 8.1 verwenden, müssen Sie OpenSL ES Wenn Sie Oboe verwenden, können Sie Ihre App so konfigurieren, dass die Latenz. Weitere Informationen finden Sie unter Optimale Latenz erzielen in den GitHub-Dokumenten.

Ergebnisse der Checkliste

Die folgende Tabelle enthält OboeTester der Round-Trip-Latenz (Eingabe-zu-Ausgabe).

Konfiguration Latenz (ms)
Allen Empfehlungen folgen 20
Leistungsmodus ohne niedrige Latenz 205
Nicht EXKLUSIV (GETEILT) 26
44.100 Hz (AAudio) 160
44.100 Hz (Oboen-SRC) 23
Kein Ausgabe-Callback (Output Callback, MMAP) verwendet 21
Kein Ausgabe-Callback (kein MMAP) 62
Puffergröße auf Maximum eingestellt 53