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

ARCore 1.17.0 で追加

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

マルチスレッド レンダリング パイプラインを使用するアプリは、バッファリングを使用してレンダリング パフォーマンスを改善できます。また、バッファリングにより、アプリはより一貫したフレームレートでフレームをレンダリングできるため、UI レンダリングが遅いことによる映像の途切れを減らすことができます。

前提条件

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

  1. アプリで有効にした場合: 複数のテクスチャ ID を指定して Session.setCameraTextureNames(ids) を呼び出します。

  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 に 1 ピクセルあたり 3 バイトの RGB データを乗算することで得られます)。

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

複数のカメラフレームを使用してもフレームレートの変動が減少するとは限りません。また、マルチスレッド レンダリング パイプラインを使用しても、すべての状況でパフォーマンスが向上するとは限りません。実際のパフォーマンスには、次の要因が影響します。

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

  • アプリのスレッドモデル

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

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

アプリで追加のカメラフレームを利用できない場合、複数のテクスチャを使用してもパフォーマンス上のメリットはありません。

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

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

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

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