缓冲相机帧

在 ARCore 1.17.0 中添加

大多数应用只需要缓冲单个相机帧以进行渲染。不过,ARCore 还支持在固定大小的轮循纹理队列中缓冲多个摄像头帧。

具有多线程渲染管道的应用可以使用缓冲来帮助提高渲染性能。缓冲还有助于应用以更稳定的帧速率渲染帧,从而减少界面渲染缓慢导致的视觉卡顿。

前提条件

在以下任何条件下,相机图像缓冲都会启用:

  1. 由应用启用:通过调用 Session.setCameraTextureNames(ids) 使用多个纹理 ID。

  2. 启用一个或多个需要内部缓冲的 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) 提供包含一个或多个纹理 ID 的数组。此函数仅在创建会话后调用,通常仅被调用一次。

在每次调用 Session.update() 期间,ARCore 都会按轮循序列覆盖队列中的下一个纹理。如果您的应用仅设置了一个纹理 ID,那么每次都会覆盖同一个纹理。

使用 Frame.getCameraTextureName() 确定与当前帧关联的纹理 ID。