开发示例

示例1 ARM演示应用程序

ARM提供了基于附件的VRS的示例应用程序,当启用VRS时,性能提高约10%。

 

 

ARM演示应用程序示例

 

API 用法

该应用程序提供动态VRS开关,让用户可以轻松检查图片质量和性能提升。当启用VRS时,将基于附件的VRS8x8像素大小应用在其中三个渲染通道(间接漫反射、间接镜射和环境光照)。

 

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 游戏渲染工作量細部拆解