最近帮项目组排查了一个PBO(Pixel Buffer Object)更新导致的开销

项目组是使用了ComputeShader做实时纹理压缩ASTC格式,然后将压缩后的问题通过PBO的方式更新至使用的贴图上。在这期间,项目组反馈他们在移动端Android上更新贴图会碰到约20ms~30ms不等的更新开销,通过引擎侧的插桩分析,发现CPU在提交PBO的glCompressedTexSubImage2D函数中有等待行为。

遂排查项目组使用的代码
发现项目组在ComputeShader发起Dispatch后立即提交了PBO的更新

从OpenGL/GLES的官方文档来看,PBO的提交是个异步操作,CPU不应该会产生这样奇怪的等待行为才对,理论上提交PBO更新也只是向异步队列中压栈操作。

后面经过与高通的沟通,确认了他们GLES的驱动行为中如果PBO使用的Buffer在当帧中被写入了,驱动会发出glFinish信号,等待前面的context绘制完成,正是glFinish的调用导致了CPU的异常等待。

因此在使用PBO的时候需要注意,提交PBO的更新时要确保PBO的Buffer没有在当前帧被其他Draw或者Dispatch操作引用。

说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...