避免GMEM加载
避免GMEM加载
在每帧渲染之后清除或使所有帧缓存附件无效
由于移动GPU的硬件条件各不相同,有些在PC和游戏机等平台上运行良好的编程技术可能无法很好地移植到移动设备上。
图形内存(GMEM)负载是影响移动应用中的GPU性能的最常见问题之一。本文将向您展示如何使用Snapdragon Profiler在应用代码中查找GMEM负载。
剖析GMEM负载
Qualcomm® Adreno™ GPU的平铺架构管道包括渲染过程,在此过程中每个图块都会渲染到GMEM中。在驱动程序正常行为之后,每个图块先前帧缓冲区的数据从主存储器加载到GMEM中;换句话说,发生了GMEM加载(或解析)。
问题是每个GMEM负载都会拖慢处理速度。但是,如果帧缓存内容被清除或失效,驱动程序就可以在GMEM中清除该图块。虽然这么做涉及到额外的图形调用,从而增加开销,但是相对于每次渲染图元,都要将帧缓存再加载至GMEM来说,代价要小得多。
出现GMEM加载有两个主要原因:
- 向驱动程序发出错误提示——应用代码使驱动程序认为需要之前的帧缓存内容,往往忽略清除缓存。这种现象的修复相对简单,可以很好的缩短渲染时间。因为Vulkan明确处理这种现象,因此主要出现在OpenGL ES编程。
- 算法——某些API,如glReadPixels和glFlush强制管道刷新以获取结果。在恢复绘制帧内容时,执行此中间帧将导致GMEM加载。通常可以通过修改算法,避免GMEM加载。
利用Snapdragon Profiler检测GMEM负载
在Snapdragon Profiler中使用“跟踪捕获”模式,允许“渲染阶段”指标在各自轨迹中突出显示GMEM负载。下面的屏幕截图基于Depth of Field演示应用程序,红色块表示在渲染四个不同表面(0, 16, 32和48)时的GMEM加载(深度模板):
渲染阶段的“设置”对话框显示,这些GMEM加载约占总渲染时间的9%:
如果不需要GMEM加载,则可以减少约9%的帧时间。
下一步是在Snapdragon Profiler中使用Snapshot Capture模式,尝试确定导致GMEM加载的原因,如下图所示:
具有GMEM负载的第一个表面是第一个表面绑定:glBindFrameBuffer。帧缓冲区参数设置为1。
选择帧缓存对象1(FBO 1),检查资源。“检查器视图”显示表面具有“颜色”、“深度”和“模板”(Stencil)附着。
glClearColor和glClearDepth调用使GPU认为模板附着的内容与下一帧相关,从而导致GMEM加载。
同样,其他三个表面(此处为ID 5、7和9)具有模板附着,因此不会清除。
在修改代码,明确清除帧缓存中的模板内容后,再在跟踪捕获模式下验证结果,可以看到,此时不再显示GMEM加载深度模板轨迹:
在此情况下,渲染时间大约缩短了9%。
有关GMEM加载(尤其是在扩展现实应用中)的更多信息,请参阅QDN博客文章分析VR应用,获取最佳性能。
Qualcomm 开发者专区是 Qualcomm 联合CSDN 共同打造的面向中国开发者的技术专区。致力于通过提供全球最新资讯和最多元的技术资源及支持,为开发者们打造全面一流的开发环境。本专区将以嵌入式、物联网、游戏开发、Qualcomm® 骁龙™处理器的软件优化等技术为核心,打造全面的开发者技术服务社区,为下一代高性能体验和设计带来更多的想法和灵感。
加入 Qualcomm 开发者专区