开发示例
示例1: ARM演示应用程序
ARM提供了基于附件的VRS的示例应用程序,当启用VRS时,性能提高约10%。
ARM演示应用程序示例
API 用法
该应用程序提供动态VRS开关,让用户可以轻松检查图片质量和性能提升。当启用VRS时,将基于附件的VRS以8x8像素大小应用在其中三个渲染通道(间接漫反射、间接镜射和环境光照)。
Figure 3‑2显示了一个帧中绘制的整个渲染通道,其中红色圈选处的三个渲染通道是由前面提到的基于附件的VRS设置添加的。
对于每个着色率附件,每个片段大小分别由三个额外的计算通道确定。图3-3显示了每个着色率附件的可视化模式下的片段大小的结果。
(ARM演示应用程序)渲染过程示意图
(ARM演示应用程序)可视化每一层套用基于附件的VRS
我们尝试通过固定GPU最小频率来测试性能改进,以便由于限制GPU资源而导致性能限制。 Table 3‑1显示,当VRS启用时,平均性能提升约为12% 至13%。
|
平均fps |
最小fps |
最大 fps |
VRS 關 |
24.55 |
20.87 |
29.93 |
VRS 開 |
27.62 |
22.36 |
39.85 |
差異 |
12.53% |
7.14% |
33.14% |
(ARM演示应用程序)VRS性能增益
(ARM演示应用程序)VRS开启和VRS关闭之间FPS直方图比较
经过深入分析,我们发现由于大的帧缓冲大小和与照明相关的着色器计算,该三个渲染通道的GPU负载很重。 VRS可以帮助减少一些片段工作,从而节省平均约13%到14%的GPU负载。虽然引入了三个着色率附件生成的额外计算工作,但由于附件不大,只会消耗约1%到2%的GPU负载。
(ARM演示应用程序)解释为何启用VRS时有高性能效益
示例2: 测试用游戏
本文将介绍测试用游戏中套用图元着色率的方法,以降低 GPU 功耗。
API 用法
背景:在测试用游戏中,人物可以在大地图上移动并打怪。因为没有游戏的原始代码,所以需要透过 vktrace 录制 trace,以得到有开 VRS 效果的游戏内容。 MTK试着将图元着色率套用在主要的渲染通道上(即 Figure 3‑6 中的G-buffer),其中人物模型维持 1x1,游戏地图则是分别套用 1x2 / 2x1 / 2x2,取决于地图座标与人物的距离。
此外为了加强VRS的使用率,也试着将管线着色率2x2套用在半透明物件上。
(Case 2 游戏)渲染过程示意图
实验结果,在游戏跑到满帧的情况下,打开VRS可以有效减少 GPU 功耗约 26%。
MTK尝试将 GPU 频率固定住,并透过 Vulkan 的 vkCmdWriteTimestamp 对每个渲染通道估算 GPU渲染所需要的时间当作工作量的估算(注意:因为渲染通道间在GPU内部会被平行化执行,有可能GPU资源因抢占问题而导致工作量的估算不准确,需要做一些工作执行延迟的调整,在此不赘述细节)。
可以从分析表格得知,G缓冲的GPU工作量占整个游戏渲染大约快接近7成,因此套用图元着色率可以有效的降低片段指令数。
渲染通道 |
VRS 关闭 GPU 工作量 (ms) |
VRS打开 GPU工作量 (ms) |
VRS 效益 (%) |
VRS 使用方式 |
前处理 (Preprocessing) |
1.953 (7.14%) |
1.901 (7.87%) |
-0.19% |
N/A |
阴影贴图 (Shadow Map) |
0.722 (2.64%) |
0.655 (2.71%) |
-0.24% |
N/A |
G缓冲 (G-Buffer) |
18.685 (68.36%) |
15.383 (63.70%) |
-12.08% |
圖元着色率 1x1 ~ 2x2 (取決於距離) |
阴影 (Shadowing) |
圖元着色率2x2 |
|||
色彩着色 (Color Shading) |
圖元着色率1x1 或 2x2 |
|||
半透明 (Transparent) |
0.379 (1.39%) |
0.769 (3.18%) |
+1.43% |
管線着色率2x2 |
后处理特效 (Post Effect) |
4.808 (17.59%) |
5.246 (21.72%) |
+1.60% |
N/A |
使用者介面 (UI) |
0.798 (2.92%) |
0.624 (2.58%) |
-0.64% |
N/A |
加总 |
27.333 (100%) |
24.149 (100%) |
-11.65% |
(Case 2 游戏)渲染工作量細部拆解