OpenHarmony开发者论坛
标题:
【技术分享】UNREAL移动游戏中的GPU性能分析与优化
[打印本页]
作者:
ditouzoulu
时间:
2024-2-25 21:12
标题:
【技术分享】UNREAL移动游戏中的GPU性能分析与优化
[md]随着近年来移动游戏的精品化发展,玩家对于游戏画质和光影效果的要求也越来越高,而随之带来的问题也是GPU性能压力的成倍提升,并已经逐步成为了大家项目的主要瓶颈。本文是UFSH2023的技术分享,由侑虎科技的张强带来移动设备中GPU性能分析与优化方法和实用技巧。
**视频链接:**[
https://www.bilibili.com/video/B ... fadbb842b16dac5ca39
](
https://www.bilibili.com/video/B ... fadbb842b16dac5ca39
)
# **一、GPU性能分析**
![image.png](
https://forums-obs.openharmony.c ... sgh0dra0nc6u0n6.png
"image.png")
![image.png](
https://forums-obs.openharmony.c ... hyea0hphmz3zwrh.png
"image.png")
### **优化方法:**
* 高画质下,没有浪费
* 针对中低端设备,高费特性的LOD策略
### **优化尺度:**
* 衡量GPU压力
* 拆分帧率、能耗、发热因素。如overdraw、三角面片数多、后处理复杂度高等
* 指导优化方向
* 使画质分级恰到好处
### **核心性能指标:**
* 帧率,卡顿,内存,耗电,发热
* GPU更多影响帧率、耗电、发热
### **掉帧的本质:**
* GPU满频状态。在给定时间,无法完成给定帧数的渲染工作
### **耗电的本质:**
* 系统需要一定功率维持GPU的运转频率,以及GPU的数据传输
* 静态功率、动态功率、传输功率
### **发热的本质:**
* 电能的转换、数据的传输过程伴随着能量损耗
* 若设备散热能力不足,就会累积热能,提高设备温度
![image.png](
https://forums-obs.openharmony.c ... z52c5rfc862zrx2.png
"image.png")
### **可用指标:**
* SoC GPU信息
* GPU Counter,Mali/Adreno/PowerVR
![image.png](
https://forums-obs.openharmony.c ... z0wyek0zwzkuuvu.png
"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](
https://forums-obs.openharmony.c ... 3irazvzp9cg2dx4.png
"image.png")
### **图元Primitives:**
* 输入图元(Input Primitives)
* 可见图元(Visible Primitives)
* 剔除图元(Culled Primitives)。
### **Shader Cycles:**
* Shader Interpolator Cycles
* Shader Arithmetic Cycles
* Shader LoadStore Cycles
* Shader Texture Cycles![](file:///C:\Users\BIANZH~1\AppData\Local\Temp\ksohtml7540\wps6.jpg)
![image.png](
https://forums-obs.openharmony.c ... o33kfb54brr3gfr.png
"image.png")
### **核心GPU指标:**
* GPU Clocks
* GPU Bandwidth
### **重要GPU指标:**
* GPU Clocks相关
* GPU Bandwidth相关
# **二、核心指标 —— GPU Clocks**
![image.png](
https://forums-obs.openharmony.c ... 1owj4x0nt3jcl3j.png
"image.png")
![image.png](
https://forums-obs.openharmony.c ... 5zrn82r3bfnvcns.png
"image.png")
### **能效曲线**
* 横轴为功耗,纵轴为帧率。能效曲线非线性,功耗随GPU频率大约平方级增长
* 同样的事情,对于硬件,希望能用耕地的频率完成,更低的频率意味着更低的能耗
### **Dynamic Voltage and Frequency Scaling:**
* GPU侧动态调整机制,P=C*V^2*f,P功率、C常量、V电压、f频率
* 硬件侧,为了支撑更高的频率,需要提高电压,导致功率非线性上涨
* OPP机制(Operating Performance Point),任务量少时,低电压配低频率,任务量大时,高电压配高频率
### **GPU Frequency:**
* 当前频率
* 最大频率
* 1Hz = 1Clocks/秒
![image.png](
https://forums-obs.openharmony.c ... 4em4k4kaerm00rm.png
"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](
https://forums-obs.openharmony.c ... doeufdr6rljflzl.png
"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](
https://forums-obs.openharmony.c ... 4pdph1cdhq1r6vr.png
"image.png")
![image.png](
https://forums-obs.openharmony.c ... thnt1sztt44ddn1.png
"image.png")
### **Demo:**
* Overdraw每30帧增加1层用例,0-360层
* 华为V20
* 分辨率:2310*1080
* SoC:Huawei HiSilicon KIRIN 980
* GPU:Mali-G76
* 核心:MP10
* 最大频率:720MHz
![image.png](
https://forums-obs.openharmony.c ... jtyjyv3akavv39t.png
"image.png")
### **单帧GPU Clocks:**
* 与Overdraw成正比,持续上涨
* 2200帧左右为12.7M Cycles
* 12.7M > 720MHz/60 = 12M,12M之后开始无法跑满60 FPS
![image.png](
https://forums-obs.openharmony.c ... izibi4jcdbrbmgp.png
"image.png")
### **帧率走势:**
* 开始跑满60帧
* 2200帧左右开始持续下滑
* 3900帧左右有一处明显下跌(温控限频导致)
![image.png](
https://forums-obs.openharmony.c ... sl5ggb7es5sv59w.png
"image.png")
### **动态GPU频率:**
* 2200帧前GPU频率持续升高,直到满频720MHz
* 3900帧左右GPU降频(温控),为586MHz(81%),之后持续处于该频率
![image.png](
https://forums-obs.openharmony.c ... xxu8z9u8a3xl9hi.png
"image.png")
### **整体功率:**
* 2200帧前,功率持续上涨,增速较快
* 2200帧到3900帧。基本持平
* 3900帧功率明显下落
![image.png](
https://forums-obs.openharmony.c ... pk1lpdyk1pdngfv.png
"image.png")
### **GPU温度:**
* 2200帧前,温度持续上涨,增速较快
* 2200帧到3900帧,继续上涨,增速较慢,直到65℃
* 3900帧温度明显下落
![image.png](
https://forums-obs.openharmony.c ... 8ux9libebkfbgfz.png
"image.png")
### **GPU Time:**
* 500帧处有一处明显下落
* 1000帧到2000帧,基本稳定在16.6ms
* 2200帧到3900帧,持续上涨
* 3900帧有一处明显上涨,之后持续上涨
![image.png](
https://forums-obs.openharmony.c ... z4zwmaahw0hemhb.png
"image.png")
### **优化目标:**
* 单帧GPU Clocks < 最大GPU频率 / 目标帧率 * 80%
* 单帧GPU Bandwidth < 4G/s / 目标帧率
# **五、重要指标 —— GPU Clocks相关**
![image.png](
https://forums-obs.openharmony.c ... 5t88ssj5p5i81pr.png
"image.png")
![image.png](
https://forums-obs.openharmony.c ... 8gggazhvqgqmqmk.png
"image.png")
![image.png](
https://forums-obs.openharmony.c ... w2t2v60d7d0ti2c.png
"image.png")
### **GPU Utilization:**
* 定位Fragment和Non-Fragment任务的时间占比
* 可看出是否为定点处理压力/渲染面太多导致GPU压力
![image.png](
https://forums-obs.openharmony.c ... 2ctj229bb45zro9.png
"image.png")
![image.png](
https://forums-obs.openharmony.c ... asmetsnk03nxemx.png
"image.png")
### **GPU Shaded:**
* Shader Core执行的Fragment/Vertices处理量
* Overdraw = Fragment Shaded / Screen Pixels
![image.png](
https://forums-obs.openharmony.c ... exl4rbebre4sxeo.png
"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](
https://forums-obs.openharmony.c ... 1u1wah18hw0l8u0.png
"image.png")
![image.png](
https://forums-obs.openharmony.c ... 5z50jppi6k6sbi5.png
"image.png")
### **GPU Primitive:**
* 图元剔除情况
* 一般3d场景剔除百分比在50%左右或者更低
* 如果剔除比例非常高,则渲染面不太合理,可能很大的模型只有一小部分在视域体内
# **六、重要指标 —— GPU Bandwidth相关**
![image.png](
https://forums-obs.openharmony.c ... q1e7gvmaem3v3t9.png
"image.png")
![image.png](
https://forums-obs.openharmony.c ... 8c8eslrlia783z7.png
"image.png")
### **GPU Bandwidth:**
* Read/Write Bandwidth
* 通常Read的带宽比例更大
* Read的带宽可分为读纹理和读顶点的带宽,读纹理的带宽占比更大
![image.png](
https://forums-obs.openharmony.c ... 66qxqvfzyzgccc9.png
"image.png")
### **GPU Stall:**
* Read/ Write Stall
* 各种读取涉及Stall,发送传输请求,硬件压力太大传不了,请求的比例统计为Stall的百分比
* 反映当前带宽的压力
![image.png](
https://forums-obs.openharmony.c ... et5kxuz8kkb9z9k.png
"image.png")
### **GPU Cache Miss(Adreno):**
* L1/L2 Cache Miss比例
* Miss的概率越高,带宽产生越多
![image.png](
https://forums-obs.openharmony.c ... go6pwlvg3g3puox.png
"image.png")
### **GPU Texture Filter(Adreno):**
* Non-Base/Linear/Nearest/Anisotropic
* 各种指标有推荐值范围,需结合线上报告推荐值和实际测试数据,判断是否合理!
# **七、总结**
![image.png](
https://forums-obs.openharmony.c ... iip6ff56f1t8765.png
"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是否超标,若有超标,再去关注以上对应的细项,进一步判断
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5