在 ARCore 1.17.0 中添加
大多数应用只需缓冲单个相机帧即可渲染。不过, ARCore 还支持以固定大小缓冲多个相机帧 循环处理纹理队列。
采用多线程渲染管道的应用可以利用缓冲来帮助改进 渲染性能缓冲还有助于应用在渲染帧时的清晰度 稳定的帧速率,可减少因 界面渲染速度缓慢。
前提条件
只要出现以下任一情况,系统就会启用相机图像缓冲:
由应用启用时,通过调用
Session.setCameraTextureNames(ids)
启用 具有多个纹理 ID。当需要内部缓冲的一项或多项 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 x 3 个字节的 RGB 数据)。
性能考虑因素
使用多个相机帧不能保证降低 而且使用多线程渲染管道不能保证 在任何情况下都能获得更好的性能。以下因素会影响 真实效果:
应用渲染管道
应用线程模型
设备 CPU 架构
操作系统调度系统
如果您的应用无法利用额外的相机帧,则 性能优势。
启用缓冲
要指示 ARCore 使用哪些纹理来缓冲传入的相机帧,请使用
Session.setCameraTextureNames(ids)
,用于提供包含一个或多个纹理 ID 的数组。
此函数仅在会话创建后调用,并且通常仅调用
一次。
在每次调用 Session.update()
期间,ARCore 会在以下事件中覆盖下一个纹理:
按轮循顺序排列队列。如果您的应用仅设置了一个纹理 ID,
都会覆盖相同的纹理。
使用 Frame.getCameraTextureName()
确定关联的纹理 ID
使用当前帧。