ARCore 1.17.0 で追加
ほとんどのアプリは、レンダリング用に 1 つのカメラフレームをバッファするだけで済みます。ただし、 ARCore は、固定サイズでの複数のカメラフレームのバッファリングもサポートしています。 ラウンドロビン テクスチャ キューです。
マルチスレッド レンダリング パイプラインを使用するアプリでは、バッファリングを使用して レンダリングのパフォーマンスが向上します。バッファリングは、アプリがより頻繁にフレームをレンダリングするのを 常に同じフレームレートを使用する必要があります。これにより、音声が途切れることなく、 UI レンダリングが遅い。
前提条件
カメラ画像のバッファリングは、次のいずれかの条件下で有効になります。
Session.setCameraTextureNames(ids)
を呼び出してアプリで有効にする場合 複数のテクスチャ ID を持つ必要があります。内部バッファリングを必要とする 1 つ以上の ARCore 機能が、 有効にする必要があります。現在、次の機能が含まれます。
- 拡張画像
- オーグメンテッド フェイス
内部バッファリングを必要とする特定の 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 を特定します。
現在のフレームで置き換えられます。