• Snapdragon——2. 避免图像内存load


    许多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

  • 相关阅读:
    常用 JS代码
    java中的变量各占得字节数
    70种简单好用的js代码
    JavaScript window.document的属性、方法和事件小结
    JS的event对象使用总结
    PHP魔术函数执行时间和顺序解析
    javascript event详解
    JS获取鼠标点击对象
    ThinkPHP实例化模型的四种方法
    实践:服务器编写/系统架构/cache
  • 原文地址:https://www.cnblogs.com/Shaojunping/p/12342636.html
Copyright © 2020-2023  润新知