In ARCore 1.17.0 hinzugefügt
Die meisten Apps müssen zum Rendern nur einen einzelnen Kameraframe zwischenspeichern. Sie können jedoch Außerdem unterstützt ARCore die Zwischenspeicherung mehrerer Kameraframes in einer festen Größe. Round-Robin-Texturwarteschlange
Anwendungen mit einer Multithread-Rendering-Pipeline können mithilfe der Zwischenspeicherung zur Verbesserung die Rendering-Leistung steigern. Durch die Pufferung können Apps Frames auch in einem kürzeren konstante Framerate, wodurch das visuelle Ruckeln durch langsamen UI-Rendering.
Preconditions
Die Zwischenspeicherung von Kamerabildern wird unter einer der folgenden Bedingungen aktiviert:
Bei Aktivierung durch die App durch Aufrufen von
Session.setCameraTextureNames(ids)
mit mehreren Textur-IDs.Wenn mindestens eine ARCore-Funktion, die eine interne Zwischenspeicherung erfordert, aktiviert sein. Derzeit umfasst dies folgende Funktionen:
- Erweiterte Bilder
- Erweiterte Gesichter
Auf bestimmten Geräten mit ARCore-Unterstützung, die eine interne Zwischenspeicherung erfordern, ordnungsgemäß funktioniert.
Feststellen, ob die Frame-Verzögerung aktiviert ist
Um zu ermitteln, ob für ein bestimmtes Gerät und eine bestimmte AR-Sitzung Frame-Buffering verwendet wird (auch
(auch Frame-Verzögerung genannt) aktiviert, verwenden Sie die Logcat-Ausgabe adb
:
# 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.
Speicher
Mit jedem weiteren gepufferten Kamera-Frame erhöht sich die Arbeitsspeicherauslastung. Beispiel: Eine 1080p-Textur benötigt etwa 6 MB Arbeitsspeicher (wird durch Multiplizieren eines Auflösung von 1920 x 1080 x 3 Byte RGB-Daten pro Pixel).
Hinweise zur Leistung
Die Verwendung mehrerer Kamerarahmen führt nicht zwangsläufig zu einer Verringerung der Variabilität Framerates und die Verwendung einer Multithread-Rendering-Pipeline unter allen Umständen eine bessere Leistung. Folgende Faktoren wirken sich auf Leistung in der Praxis:
App-Rendering-Pipeline
Das App-Threading-Modell
Die CPU-Architektur des Geräts
Planungssystem des Betriebssystems
Wenn Ihre App keine zusätzlichen Kameraframes nutzen kann, Leistungsvorteil bei der Verwendung von mehr als einer Textur.
Pufferung aktivieren
Um ARCore anzuweisen, welche Texturen zur Zwischenspeicherung eingehender Kamerabilder verwendet werden sollen, verwenden Sie
Session.setCameraTextureNames(ids)
, um ein Array mit einer oder mehreren Textur-IDs bereitzustellen.
Diese Funktion wird erst nach der Sitzungserstellung aufgerufen und normalerweise nur
einmal.
Bei jedem Aufruf von Session.update()
überschreibt ARCore die nächste Textur in
in einer Round-Robin-Abfolge. Wenn deine App nur eine Textur-ID festlegt,
wird jedes Mal überschrieben.
Verwende Frame.getCameraTextureName()
, um die verknüpfte Textur-ID zu bestimmen
mit dem aktuellen Frame.