开发示例
示例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 游戏)渲染工作量細部拆解
 
  
  
 
