カメラフレームのバッファリング

ARCore 1.17.0 で追加

ほとんどのアプリは、レンダリング用に 1 つのカメラフレームをバッファするだけで済みます。ただし、 ARCore は、固定サイズでの複数のカメラフレームのバッファリングもサポートしています。 ラウンドロビン テクスチャ キューです。

マルチスレッド レンダリング パイプラインを使用するアプリでは、バッファリングを使用して レンダリングのパフォーマンスが向上します。バッファリングは、アプリがより頻繁にフレームをレンダリングするのを 常に同じフレームレートを使用する必要があります。これにより、音声が途切れることなく、 UI レンダリングが遅い

前提条件

カメラ画像のバッファリングは、次のいずれかの条件下で有効になります。

  1. Session.setCameraTextureNames(ids) を呼び出してアプリで有効にする場合 複数のテクスチャ ID を持つ必要があります。

  2. 内部バッファリングを必要とする 1 つ以上の ARCore 機能が、 有効にする必要があります。現在、次の機能が含まれます。

    • 拡張画像
    • オーグメンテッド フェイス
  3. 内部バッファリングを必要とする特定の ARCore 対応デバイス 動作しません。

フレーム遅延が有効かどうかを判断する

特定のデバイスと AR セッションでフレーム バッファリングが使用されているかどうかを判別する (フレーム遅延)が有効になっている場合は、adb logcat 出力を使用します。

# 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.

メモリ

バッファリングされるカメラのフレームを追加するたびに、メモリ使用率が増加します。たとえば 1080p のテクスチャは約 6 MB のメモリ( 解像度 1920 x 1080、ピクセルあたり 3 バイトの RGB データ)。

パフォーマンスに関する注意事項

複数のカメラフレームを使用しても、画像のばらつきが マルチスレッド レンダリング パイプラインを使用しても、 あらゆる状況でパフォーマンスが向上します次の要因が影響します。 実際のパフォーマンス:

  • アプリ レンダリング パイプライン

  • アプリ スレッドモデル

  • デバイスの CPU アーキテクチャ

  • オペレーティング システムのスケジューリング システム

アプリで追加のカメラフレームを利用できない場合は、 複数のテクスチャを使用すると、パフォーマンスが向上します。

バッファリングを有効にする

受信カメラフレームのバッファに使用するテクスチャを ARCore に指示するには、次のコマンドを使用します。 Session.setCameraTextureNames(ids): 1 つ以上のテクスチャ ID の配列を指定します。 この関数はセッションの作成後にのみ呼び出されます。通常、 1 回だけです。

Session.update() を呼び出すたびに、ARCore は ラウンドロビン順序でキューをルーティングします。アプリで 1 つのテクスチャ ID のみを設定する場合、 毎回同じテクスチャが上書きされます。

Frame.getCameraTextureName() を使用して、関連付けられているテクスチャ ID を特定します。 現在のフレームで置き換えられます。