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:
- Oboen verwenden
- Anfrageleistungsmodus mit niedriger Latenz
- Freigabemodus „exklusiv“ anfordern
- 48.000 Hz oder den Oboen-Abtastratenkonverter verwenden
- Nutzung auf AAUDIO_USAGE_GAME festlegen
- Daten-Callbacks verwenden
- Blockierung von Vorgängen im Callback vermeiden
- 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 |