Snapdragon——2. 避免图像内存load
2020-02-21 19:14 kk20161206 阅读(794) 评论(0) 编辑 收藏 举报许多pc或主机游戏在移植到手机上,都会有问题。
Graphics Memory(GMEM)load是其中影响gpu性能的最重要的问题。下面介绍怎么用snapdragon发现哪里GMEM Load。
剖析
tiling机制的gpu管线都有一个pass,这个pass中,每个tile都渲染到GMEM。驱动的正常行为,上一帧的frame buffer从主存load到GMEM为每个tile,也就是说GMEM load发生了。
问题在于每个GMEM Load使进程变慢。如果framebuffer被clear了,或者失效了,那么驱动可以在GMEM中清掉那个tile。尽管需要额外的图形调用和相关消耗,但是着比为每个被渲染的bin把frame buffer加载到GMEM消耗少。
主要有两个原有导致GMEM load:
1. 给驱动错误的暗示:代码使驱动任务frame buffer上帧的内容还有用,通常因为没有调用clear buffer。通常这种情况都是OpenGL ES下的,vulkan控制的比较好;
2. 算法,一些涉及到GLReadPixels、glFlush强制管线刷新,获取资源,帧中间导致GMEM load。可以通过修改算法来避免GMEM load。
在Snapdragon里检测GMEM Load
gpu stages里,下图,4个surface里都调用了GMEM load(depth stencil)
rendering stages的设置对话框显示了那些GMEM load占用了9%的渲染时间。
通过capture看什么导致了load,
1. glBindFrameBuffer,参数为1;
2. 选择fbo1看资源,发现这个surface绑定了颜色、深度、stencil;
3. glClearColor和glClearDepth调用使gpu任务stencil的内容下一帧还有用,导致了Gmem load;
4. 另外3个surface也类似,有一个stencil绑定,但是没有clear。
修改代码,清理了stencil从framebuffer,然后就没有GMEM load depth stencil轨道了。
参考:https://developer.qualcomm.com/software/snapdragon-profiler/app-notes/avoid-gmem-loads