在玩家要求游戏更流畅、画质更精美的今天,优化GPU过度使用导致的性能问题成了大多数游戏开发团队关注的核心。当项目的GPU压力达到一定阈值时,卡顿、掉帧、发热、降频等问题便随之而来,严重影响用户体验。
为了解决项目的GPU压力问题,UWA GOT Online Overview模式中已推出的GPU Counter功能,展示GPU负载、着色、带宽、图元等参数,帮助开发者对GPU性能压力进行更详细的分析。在最新版UWA SDK 2.4.7中,UWA进一步新增了SoC GPU信息功能和更多GPU Counter数据,在宏观监控GPU压力的同时,更全面、更准确地定位GPU压力来源。下面将详解SoC GPU信息和GPU Counter相关数据的解读和UWA建议。
需要注意的是,基于各个厂商的GPU架构不同,同一参数在不同品牌芯片上的推荐值也会存在差异,不同设备间横向对比的意义不大,UWA更推荐大家在相同的设备上进行纵向对比。
SoC GPU信息
在SoC GPU信息模块下,开发者可以从更宏观的角度对设备的GPU运行情况进行监控,在观察GPU运行状态、判断是否存在GPU降频情况的同时,也可以快速定位GPU压力较大的场景,以便更有针对性地进一步分析这些场景的性能压力来源。
SoC GPU信息目前仅支持MTK SoC设备和安卓10及以上的HISI SoC设备,具体支持设备列表可通过下图或登录UWA官网对“GOT Online支持设备列表”列表进行查询:
https://www.uwa4d.com/main/supported.html
GPU频率
GPU频率(GPU Freq)表示当前采样帧GPU的工作频率,不同型号和厂商的GPU具有不同的额定最大频率,且GPU会动态调整工作频率。开发者可以通过GPU频率观察GPU的工作情况,结合GPU Counter下的具体参数,快速判断GPU是否处于正常工作状态。
GPU负载
GPU负载(GPU Utilization),表示当前GPU频率相对于GPU额定最大频率的百分比,该参数走势和GPU频率走势一致。
当GPU负载持续较高时,说明设备持续处于高压场景,长期处于这种情况会容易引起GPU过热,造成游戏性能表现下滑,需要开发者结合GPU Counter模块重点关注这些场景的GPU压力。
需要注意的是,SoC下的GPU负载体现的是GPU整体运行层面的负载情况,Mali/PowerVR GPU Counter下的Fragment和Non-Fragment负载(具体参考:《GPU Counter功能更新|支持Adreno、PowerVR芯片》)则是体现了GPU内部的两个主要工作单元的负载情况,各自代表了不同层面下的GPU负载情况,分析时需要根据对应的层面综合分析。
MTK GPU利用率
在MTK SoC设备上,UWA支持GPU利用率(GPU Loading),表示GPU的时钟周期数占当前可用时钟周期数的百分比,即当前额定频率的利用率。需要注意的是,GPU利用率仅表示当前频率下GPU的使用情况,而非GPU压力情况。
HISI DDR频率
在HISI SoC设备上,UWA支持DDR频率(DDR Freq)参数,表示设备系统内存频率,而DDR的工作状态也会影响到GPU的性能释放。
GPU Counter
GPU Counter则是对GPU下各个模块的数据进行了更全面的补充。在此次更新中,UWA新增了GPU活动、GPU着色、GPU缓存三项性能参数,同时补充了之前版本下不同厂商的数据。在进一步完善了GPU数据的全面性和准确性的同时,也可以使开发者可以更便捷地定位项目的性能瓶颈、制定性能标准。
GPU活动
在Mali/PowerVR/Adreno GPU Counter页下,都新增了GPU活动参数,即GPU Clocks,表示渲染一帧耗费的GPU时钟周期数,是用于衡量GPU性能的主要指标。通过GPU Clocks,开发者可以快速定位项目的GPU压力主要来自哪些场景,并结合GPU Counter下的其他参数对GPU压力情况进行具体分析。
GPU着色
在Mali/PowerVR/Adreno GPU Counter下的GPU着色页下,都新增了Fragment shaded和Vertices shaded两项指标。Mali/PowerVR下已有的Cycles/Pixel可以表示项目的平均每像素复杂度,新增的Fragment shaded和Vertices shaded则可以从另一个方面体现项目的Overdraw情况。
其中Fragment shaded表示每帧Fragment shader执行了多少次,用Fragment shaded数除以设备分辨率,可以侧面反映项目的Overdraw情况。
当Overdraw较高时,容易引起发热和能耗方面的问题。我们可以通过降低半透明粒子特效的粒子数量、使用不规则面片代替矩形面片渲染粒子特效或UI等方式,减少项目的Overdraw层数,降低GPU压力。
而Vertices shaded则表示每帧Vertex shader执行了多少次。使用Vertices shaded除以输入图元数,即可得到平均每个图元进行了多少次Vertices shaded。UWA推荐平均每个图元执行次数应控制在1.5次以下。
Mali GPU缓存
Mali GPU缓存包括Read Stall和Write Stall两项数据,分别表示外部读、写事件上GPU处于等待状态周期数占总周期数的百分比。即当GPU向系统内存发出请求时,系统内存没有及时响应,等待时间占GPU活动时间百分比。
GPU缓存情况可以直接体现GPU带宽压力:Read Stall和Write Stall越低,GPU运行状态越好,UWA建议这两项参数应各自控制在5%以下。
当Read Stall较高时,说明此时GPU存在较明显的带宽压力,开发者可以通过降低目标帧率、减少纹理资源与网格资源的大小和数量等方式对带宽压力进行优化;当Write Stall较高时,则可以降低网格复杂度,或通过控制Framebuffers的数量与内存大小进行优化。
PowerVR GPU缓存
PowerVR GPU缓存则是增加了GPU Memory Bus Utilization参数,即每帧GPU内存总线负载。它表示当前GPU带宽消耗占总可用带宽的百分比。
当GPU Memory Bus Utilization持续较高时,说明GPU访问内存的频率过于频繁,可以通过减少纹理资源与网格资源的大小和数量控制GPU缓存的占比。
Adreno GPU缓存
Adreno GPU缓存在原有的基础上新增了Texture L2 Cache Miss,以便开发者对缓存命中情况进行更全面考量。关于Texture L1 Cache Miss的定义和优化方式,可以参考之前的文章:《GPU Counter功能更新|支持Adreno、PowerVR芯片》。
除了上述新功能外,UWA还在Adreno GPU Counter下新增了GPU带宽、在PowerVR GPU Counter下新增了GPU负载功能。由于这两个参数的数据含义和优化方式与其他GPU Counter一致,此次不再赘述,大家可以通过以下往期文章查看。
GPU带宽:《GPU Counter、Timeline功能上线 | 性能优化快人一步!》
GPU负载:《GPU Counter功能更新|支持Adreno、PowerVR芯片》
提示:在测试开始前,部分设备可能会弹出无法正常获取GPU Counter的提示,建议大家查看用户手册中的《1.3本地测试-注意事项》篇,对GPU Counter采集异常的情况进行排查,并根据文档中的方法尝试获取GPU Counter数据。
如果您对新功能感兴趣,请前往UWA官网下载SDK,下载链接:
UWA | 致力于游戏VR和AR应用提供项目研发解决方案 | 简单优化、优化简单 | 侑虎科技
相关推荐
《功能上新|内存篇:PSS显存、内存占用、堆内存对象快照》