最近帮项目组排查了一个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操作引用。
声明:
本文采用
BY-NC-SA
协议进行授权,如无注明均为原创,转载请注明转自
凤曦的小窝
本文地址: OpenGL/GLES PBO延迟/更新慢 问题排查
本文地址: OpenGL/GLES PBO延迟/更新慢 问题排查