Kamerabilder werden zwischengespeichert

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:

  1. Wenn dies in der App aktiviert ist, indem Session.setCameraTextureNames(ids) mit mehreren Textur-IDs aufgerufen wird.

  2. Eine oder mehrere ARCore-Funktionen, die eine interne Zwischenspeicherung erfordern, sind aktiviert. Derzeit sind folgende Funktionen verfügbar:

    • Erweiterte Bilder
    • Erweiterte Gesichter
  3. 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.