了解图形内存加载并排除故障
由于移动GPU的硬件条件不同,一些运行在PC、游戏机等平台上的编程技术无法很好地移植到移动设备上。
视频内存 (GMEM) 负载是影响移动应用中 GPU 性能的最常见问题之一。 本节介绍如何使用Snapdragon Profiler在APP应用程序代码中搜索GMEM负载。
简而言之像素游戏素材,清除或禁用所有帧缓冲区附件。 它指示 GPU 不要将块数据从系统内存加载到 GMEM 中。
显卡显存的负载是多少? Qualcomm Adreno GPU 瓦片结构管道包含渲染通道。 在渲染过程中android游戏开发框架,每个块都被渲染为 GMEM。 在驱动程序的正常操作中,先前的帧缓冲区数据从主内存加载到每个图块的 GMEM 中,然后加载(或不解析)GMEM。
为什么显存负载过重? 问题是所有 GMEM 负载都会减慢处理速度。 如果清除或禁用帧缓冲区的内容硬件设备,驱动程序可以清除 GMEM 中的块。 这包括额外的图形调用及其相关开销,但比将渲染中的所有色情鸭子的帧缓冲区重新加载到 GMEM 中要便宜。
GMEM 负载有两个主要原因。
APP应用程序代码确定驱动程序需要帧缓冲区的早期内容。 缓冲区的清除通常被忽略。 这是一个相对简单的修复,它在减少渲染时间方面带来了巨大的好处。 Vulkan 显式处理条件,因此主要适合 OpenGL ES 编程。 33558 某些 API(例如 glreadpixels 和 glFlush)强制更新管道以获得结果。 如果在恢复绘图框架的内容时运行此中间框架,则将加载 GMEM。 一般情况下,可以通过修改算法来避免GMEM负载。 当在跟踪捕获模式下使用 Snapdragon Profiler 时,Snapdragon Profiler 会检测图形内存负载,渲染阶段指标可以突出显示其自己轨道上的 GMEM 负载。
下面的屏幕截图基于 Adreno SDK 的景深演示 APP。 红色块表示渲染四个不同表面(0、16、32 和 48)时发生 GMEM 加载(深度模板)。
“渲染阶段设置”对话框显示这些 GMEM 负载约占渲染时间的 9%。
如果不需要 GMEM 加载,大约 9% 的帧时间可以被重用。
然后可以在快照分析器中使用快照捕获模式来确定 GMEM 负载的原因。
应用 GMEM 负载的第一个表面是第一个绑定表面 - glBindFrameBuffer。 将帧缓冲区参数设置为 1: # 并选择帧缓冲区对象 1 (FBO1) 来检查资源。 检查器视图显示表面的附件,包括颜色、深度和模板。 #通过调用#glClearColor和glClearDepth,GPU认为Stencil附件的内容与下一帧相关。 这导致 GMEM 加载。 同样,其他三个表面(在本例中为 ID 5、7 和 9)具有模板附件android游戏开发框架,并且不会被清除。
修改代码以显式清除帧缓冲区中的 Stencil 内容后,可以在跟踪捕获模式下验证结果。 在此模式下,GMEM 加载的深度 Stencil 轨迹将不再显示。
在这种情况下,渲染时间减少了大约 9%。
特别是,请参阅 QDN 博客文章 profilingvrappsforbetterperformance,了解有关增强现实应用程序中 GMEM 有效负载的详细信息。