缓冲相机帧

在 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 x 3 个字节的 RGB 数据)。

性能考虑因素

使用多个相机帧不能保证降低 而且使用多线程渲染管道不能保证 在任何情况下都能获得更好的性能。以下因素会影响 真实效果:

  • 应用渲染管道

  • 应用线程模型

  • 设备 CPU 架构

  • 操作系统调度系统

如果您的应用无法利用额外的相机帧,则 性能优势。

启用缓冲

要指示 ARCore 使用哪些纹理来缓冲传入的相机帧,请使用 Session.setCameraTextureNames(ids),用于提供包含一个或多个纹理 ID 的数组。 此函数仅在会话创建后调用,并且通常仅调用 一次。

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

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