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