Mit ARCore 1.17.0 hinzugefügt
Die meisten Apps müssen nur einen einzelnen Kameraframe für das Rendering zwischenspeichern. ARCore unterstützt jedoch auch die Zwischenspeicherung mehrerer Kameraframes in einer Round-Robin-Texturwarteschlange mit fester Größe.
Anwendungen mit einer Multithread-Rendering-Pipeline können die Zwischenspeicherung nutzen, um die Rendering-Leistung zu verbessern. Durch die Zwischenspeicherung können Apps außerdem Frames mit einer gleichmäßigeren Framerate rendern, was durch langsames UI-Rendering visuelles Ruckeln vermeiden kann.
Preconditions
Die Zwischenspeicherung von Kamerabildern wird unter beliebigen der folgenden Bedingungen aktiviert:
Wenn dies in der App aktiviert ist, indem
Session.setCameraTextureNames(ids)
mit mehreren Textur-IDs aufgerufen wird.Eine oder mehrere ARCore-Funktionen, die eine interne Zwischenspeicherung erfordern, sind aktiviert. Derzeit sind folgende Funktionen verfügbar:
- Erweiterte Bilder
- Erweiterte Gesichter
Auf bestimmten von ARCore unterstützten Geräten, die für eine korrekte Funktionsweise eine interne Pufferung erfordern
Festlegen, ob die Frame-Verzögerung aktiviert ist
Verwenden Sie die Logcat-Ausgabe adb
, um festzustellen, ob die Frame-Zwischenspeicherung (auch Frame Delay) auf einem bestimmten Gerät und einer bestimmten AR-Sitzung aktiviert ist:
# Camera frame buffering is turned off when frame delay is zero.
adb logcat | grep 'Update Frame Delay'
… I native : session.cc:3141 Update Frame Delay to 0 frames.
# Camera frame buffering is turned on when frame count is non-zero.
# Note: The size of the buffer can vary over time.
adb logcat | grep 'Update Frame Delay'
… I native : session.cc:3141 Update Frame Delay to 6 frames.
…
… I native : session.cc:3141 Update Frame Delay to 4 frames.
…
… I native : session.cc:3141 Update Frame Delay to 2 frames.
Arbeitsspeicher
Mit jedem zusätzlichen gepufferten Kamerabild wird die Speicherauslastung erhöht. Eine 1.080p-Textur verbraucht beispielsweise etwa 6 MB Arbeitsspeicher (wird durch Multiplizieren einer Auflösung von 1.920 × 1.080 mit 3 Byte RGB-Daten pro Pixel ermittelt).
Hinweise zur Leistung
Die Verwendung mehrerer Kamerarahmen führt nicht zwangsläufig dazu, dass die Variabilität der Frameraten verringert wird. Außerdem ist nicht garantiert, dass die Verwendung einer Multithread-Rendering-Pipeline unter allen Umständen zu einer besseren Leistung führt. Die folgenden Faktoren beeinflussen die Leistung in der Praxis:
Anwendungs-Rendering-Pipeline
Das App-Threading-Modell
Die CPU-Architektur des Geräts
Das Planungssystem des Betriebssystems
Wenn Ihre App keine zusätzlichen Kamerarahmen nutzen kann, ergibt sich durch die Verwendung von mehr als einer Textur kein Leistungsvorteil.
Zwischenspeichern aktivieren
Wenn du ARCore anweist, welche Texturen zum Zwischenspeichern eingehender Kameraframes verwendet werden sollen, kannst du mit Session.setCameraTextureNames(ids)
ein Array mit einer oder mehreren Textur-IDs angeben.
Diese Funktion wird nur nach der Sitzungserstellung und normalerweise nur einmal aufgerufen.
Bei jedem Aufruf von Session.update()
überschreibt ARCore die nächste Textur in der Warteschlange in einer Round-Robin-Sequenz. Wenn in Ihrer Anwendung nur eine Textur-ID festgelegt wird, wird jedes Mal dieselbe Textur überschrieben.
Mit Frame.getCameraTextureName()
kannst du die Textur-ID ermitteln, die dem aktuellen Frame zugeordnet ist.