[经验分享] 【技术分享】UNREAL移动游戏中的GPU性能分析与优化

ditouzoulu 显示全部楼层 发表于 2024-2-25 21:12:49

随着近年来移动游戏的精品化发展,玩家对于游戏画质和光影效果的要求也越来越高,而随之带来的问题也是GPU性能压力的成倍提升,并已经逐步成为了大家项目的主要瓶颈。本文是UFSH2023的技术分享,由侑虎科技的张强带来移动设备中GPU性能分析与优化方法和实用技巧。

视频链接:https://www.bilibili.com/video/BV15c411b7rq/?spm_id_from=333.999.0.0&vd_source=d137f59271b4afadbb842b16dac5ca39

一、GPU性能分析

image.png

image.png

优化方法:

  • 高画质下,没有浪费
  • 针对中低端设备,高费特性的LOD策略

优化尺度:

  • 衡量GPU压力
  • 拆分帧率、能耗、发热因素。如overdraw、三角面片数多、后处理复杂度高等
  • 指导优化方向
  • 使画质分级恰到好处

核心性能指标:

  • 帧率,卡顿,内存,耗电,发热
  • GPU更多影响帧率、耗电、发热

掉帧的本质:

  • GPU满频状态。在给定时间,无法完成给定帧数的渲染工作

耗电的本质:

  • 系统需要一定功率维持GPU的运转频率,以及GPU的数据传输
  • 静态功率、动态功率、传输功率

发热的本质:

  • 电能的转换、数据的传输过程伴随着能量损耗
  • 若设备散热能力不足,就会累积热能,提高设备温度

image.png

可用指标:

  • SoC GPU信息
  • GPU Counter,Mali/Adreno/PowerVR

image.png

常用GPU Counter类别:

  • GPU Clocks,594.08万Cycles
  • GPU Freq,449.98 MHz
  • GPU Usage,62.02%
  • GPU Time,15.18 ms
  • GPU Utilization,74.68%
  • GPU Shaded,868.15万个
  • GPU Bandwidth,34.49MB
  • GPU Stall,7.45%
  • GPU Primitive,119013个
  • GPU Shader Cycles,55.46百万Cycles
  • DDR Freq,0.68GHz

image.png

图元Primitives:

  • 输入图元(Input Primitives)
  • 可见图元(Visible Primitives)
  • 剔除图元(Culled Primitives)。

Shader Cycles:

  • Shader Interpolator Cycles
  • Shader Arithmetic Cycles
  • Shader LoadStore Cycles
  • Shader Texture Cycles

image.png

核心GPU指标:

  • GPU Clocks
  • GPU Bandwidth

重要GPU指标:

  • GPU Clocks相关
  • GPU Bandwidth相关

二、核心指标 —— GPU Clocks

image.png

image.png

能效曲线

  • 横轴为功耗,纵轴为帧率。能效曲线非线性,功耗随GPU频率大约平方级增长
  • 同样的事情,对于硬件,希望能用耕地的频率完成,更低的频率意味着更低的能耗

Dynamic Voltage and Frequency Scaling:

  • GPU侧动态调整机制,P=CV^2f,P功率、C常量、V电压、f频率
  • 硬件侧,为了支撑更高的频率,需要提高电压,导致功率非线性上涨
  • OPP机制(Operating Performance Point),任务量少时,低电压配低频率,任务量大时,高电压配高频率

GPU Frequency:

  • 当前频率
  • 最大频率
  • 1Hz = 1Clocks/秒

image.png

GPU Active:

  • GPU工作时长,可分为Fragment相关和非Fragment相关,像素和顶点的处理会在两条不同队列里执行
  • GPU Active可分为Non-frag active和Frag active,分别处理非像素和像素部分任务,中间有一段并行时间
  • GPU Load:GPU工作时间占比,一帧中GPU工作时间除以该帧总时长
  • GPU Time:一帧中GPU工作时长

GPU Clocks:

  • 每秒对应关系:GPU Clocks ~= GPU Freq (clocks/s) GPU Loading (%) 1 (s)
  • 每帧对应关系:GPU Clocks ~= GPU Freq (clocks/s) * GPU Time (ms) / 1000

1 Clocks处理的工作包括:

  • pscpc发射一个新线程(pscpc为per shader core per clock)
  • pscpc结束并混合一个fragment
  • pscpc写入一个像素
  • pscpc发射一条指令
  • pc处理14条FP16操作
  • pc读取64 位uniform数据
  • pc插值64位varing数据
  • pc采样一个双线性滤波纹素
  • ...

衡量单帧画面的GPU工作量:

  • 对于相同设备、相同渲染内容,单帧GPU Clocks基本不变

掉帧本质:

  • GPU满频状态,在给定时间内,无法完成给定帧数的渲染工作
  • 单帧GPU Clocks * 目标帧率 > 最大GPU频率

耗电本质:

  • 系统需要一定的功率,维持GPU的运转频率,以及GPU的数据传输
  • 静态功率、动态功率、传输功率
  • 动态功率:单帧GPU Clocks 目标帧率 > 最大GPU频率 80%
  • 传输功率:单帧GPU Bandwidth * 目标帧率 > 4G/s

三、核心指标 —— GPU Bandwidth

image.png

GPU Bandwidth:

  • 在shader cores中处理各种渲染任务时,如采纹理、访问顶点时,如果数据在L1/L2 Cache时,带宽相对有限(Internel Read/Write),如果不在其中,需要到显存访问(External Read/Write),带宽就会比较大

传输功率:

  • 1GB/s带宽对应功耗约100mW左右

预估范围:

  • SoC功率(100%):2000 ~ 4000mW
  • GPU功率(40%):800 ~ 1600mW
  • GPU传输功率(10% ~ 15%):200 ~ 600mW
  • 按100mW ~ 1GB/s,约为2 ~ 6GB/s,大多数游戏优化好,在3 ~ 4GB/s左右,高画质在7 ~ 8GB/s

发热本质:

  • 电能转换、数据传输伴随能量损耗(热能),Q = I^2 R t
  • 若设备散热能力不足,会累积热能,提高设备温度
  • SoC功率 > 4000mW

四、Demo数据分析

image.png

image.png

Demo:

  • Overdraw每30帧增加1层用例,0-360层
  • 华为V20
    • 分辨率:2310*1080
    • SoC:Huawei HiSilicon KIRIN 980
    • GPU:Mali-G76
    • 核心:MP10
    • 最大频率:720MHz

image.png

单帧GPU Clocks:

  • 与Overdraw成正比,持续上涨
  • 2200帧左右为12.7M Cycles
  • 12.7M > 720MHz/60 = 12M,12M之后开始无法跑满60 FPS

image.png

帧率走势:

  • 开始跑满60帧
  • 2200帧左右开始持续下滑
  • 3900帧左右有一处明显下跌(温控限频导致)

image.png

动态GPU频率:

  • 2200帧前GPU频率持续升高,直到满频720MHz
  • 3900帧左右GPU降频(温控),为586MHz(81%),之后持续处于该频率

image.png

整体功率:

  • 2200帧前,功率持续上涨,增速较快
  • 2200帧到3900帧。基本持平
  • 3900帧功率明显下落

image.png

GPU温度:

  • 2200帧前,温度持续上涨,增速较快
  • 2200帧到3900帧,继续上涨,增速较慢,直到65℃
  • 3900帧温度明显下落

image.png

GPU Time:

  • 500帧处有一处明显下落
  • 1000帧到2000帧,基本稳定在16.6ms
  • 2200帧到3900帧,持续上涨
  • 3900帧有一处明显上涨,之后持续上涨

image.png

优化目标:

  • 单帧GPU Clocks < 最大GPU频率 / 目标帧率 * 80%
  • 单帧GPU Bandwidth < 4G/s / 目标帧率

五、重要指标 —— GPU Clocks相关

image.png

image.png

image.png

GPU Utilization:

  • 定位Fragment和Non-Fragment任务的时间占比
  • 可看出是否为定点处理压力/渲染面太多导致GPU压力

image.png

image.png

GPU Shaded:

  • Shader Core执行的Fragment/Vertices处理量
  • Overdraw = Fragment Shaded / Screen Pixels

image.png

GPU Shader Cycles:

  • Shader Core执行的4种类型的cycles的量
  • Shader Core执行的4种单元:
    • Arithmetic/Execution Engine 数学计算
    • Interpolator/Varying Unit 顶点到像素shader的插值计算
    • LoadStore/Load/Store Unit 寄存器存取
    • Texture/Texture Unit 纹理采样
  • 并行处理,不同元器件分别在执行

image.png

image.png

GPU Primitive:

  • 图元剔除情况
  • 一般3d场景剔除百分比在50%左右或者更低
  • 如果剔除比例非常高,则渲染面不太合理,可能很大的模型只有一小部分在视域体内

六、重要指标 —— GPU Bandwidth相关

image.png

image.png

GPU Bandwidth:

  • Read/Write Bandwidth
  • 通常Read的带宽比例更大
  • Read的带宽可分为读纹理和读顶点的带宽,读纹理的带宽占比更大

image.png

GPU Stall:

  • Read/ Write Stall
  • 各种读取涉及Stall,发送传输请求,硬件压力太大传不了,请求的比例统计为Stall的百分比
  • 反映当前带宽的压力

image.png

GPU Cache Miss(Adreno):

  • L1/L2 Cache Miss比例
  • Miss的概率越高,带宽产生越多

image.png

GPU Texture Filter(Adreno):

  • Non-Base/Linear/Nearest/Anisotropic
  • 各种指标有推荐值范围,需结合线上报告推荐值和实际测试数据,判断是否合理!

七、总结

image.png

核心指标:

  • GPU Clocks
  • GPU Bandwidth

重要指标:

  • GPU Clocks相关:
    • Utilization,Shaded,Shader Cycles,Primitive
  • GPU Bandwidth相关:
    • Read,Write,Stall,Cache Miss,Texture Filtering

总结:

  • 衡量GPU压力的时候,先关注核心指标,Clocks、Bandwidth是否超标,若有超标,再去关注以上对应的细项,进一步判断
无用

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部