Kamerabilder werden zwischengespeichert

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:

  1. Bei Aktivierung durch die App durch Aufrufen von ArSession_setCameraTextureNames(ids) mit mehreren Textur-IDs.

  2. Wenn mindestens eine ARCore-Funktion, die eine interne Zwischenspeicherung erfordert, aktiviert sein. Derzeit umfasst dies folgende Funktionen:

    • Erweiterte Bilder
    • Erweiterte Gesichter
  3. 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 ArSession_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 ArSession_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 ArFrame_getCameraTextureName(), um die verknüpfte Textur-ID zu bestimmen mit dem aktuellen Frame.