Adreno Vulkan Application Optimizations(2)

一、简介
在上一篇中,我们介绍了部分关于优化Vulkan程序的内容,本篇文章中我们将继续为大家介绍这部分的内容。

二、Vulkan优化
线程在运行/动态分支:
分支对于着色器的性能至关重要。每次分支遇到分歧,或者线程的某些元素以一种方式分支,而某些元素以另一种方式分支,这两个分支都将使用谓词,对不接受给定分支的元素使用空出操作。只有当数据按照以下方式对齐时,这才是正确的条件,片段着色器很少出现这种情况。
有三种类型的分支,按在Adreno上从最佳性能到最差的顺序列出平均值:
1、在编译时已知的常数上分支
2、均匀变量上的分支
3、在着色器内部修改的变量上分支
在常数上分支可以产生可接受的性能。
包着色器插值器
着色器插值或变量需要GPR(通用寄存器)来保存输入片段着色器的数据。因此,尽量减少它们的使用。
在值一致的情况下使用常量。将值打包在一起,因为无论是否使用,所有变量都有四个组件。将两个vec2纹理坐标放入单个vec4值中是一种常见的做法,但其他策略则采用更具创造性的打包和动态数据压缩。
尽可能减少shader GPRs的使用
减少GPRs的使用量是优化性能的重要手段。向编译器输入更简单的着色器有助于确保最佳结果。修改GLSL以保存甚至一条指令有时也可以保存GPR。不展开循环也可以节省GPRs,但这取决于着色器编译器。始终分析着色器,以确保所选的最终解决方案对于目标平台是最有效的。展开的循环倾向于将纹理提取放在材质球顶部,因此需要更多的GPRs来同时保存多个纹理坐标和提取的结果。
例如,如果展开下面显示的循环:
for (i = 0; i < 4; ++i) {
diffuse +=
ComputeDiffuseContribution(normal,
light[i]);
}
代码段将替换为:
diffuse += ComputeDiffuseContribution(normal, light[0]);
diffuse += ComputeDiffuseContribution(normal, light[1]);
diffuse += ComputeDiffuseContribution(normal, light[2]);
diffuse += ComputeDiffuseContribution(normal, light[3]);

最小化着色器指令计数
编译器优化特定的指令,但它不是自动有效的。尽可能分析着色器以保存指令。即使只保存一条指令也是值得的。
避免uber着色器:
Uber着色器将多个着色器合并为使用静态分支的单个着色器。如果试图减少状态更改和批处理绘图调用,那么使用它们是有意义的。但是,这通常会增加GPR计数,从而影响性能。

避免对着色器常量进行数学运算:
自从shaders出现以来,几乎每一款游戏都使用指令对shader常量执行不必要的数学运算。在着色器中标识这些指令,并将这些计算转移到CPU。在后压缩的微代码中,可能更容易识别着色器常量的数学表达式。
避免丢弃片段着色器中的像素
一些开发人员认为,手动丢弃片段着色器中的像素(也称为killing)可以提高性能。规则并不那么简单,原因有二:
1、如果线程中的某些像素被杀死,而其他像素没有被杀死,则着色器仍会执行。
2、这取决于着色器编译器如何生成微代码。
理论上,如果线程中的所有像素都被杀死,GPU将尽快停止处理该线程。实际上,放弃操作可以禁用硬件优化。
如果着色器无法避免放弃操作,请尝试渲染几何体,这取决于不透明绘制调用后的操作。
避免在片段着色器中修改深度:
与丢弃片段类似,修改片段着色器中的深度可以禁用硬件优化。

避免在顶点着色器中获取纹理:
Adreno基于统一的着色器架构,这意味着顶点处理性能与片段处理性能类似。但是,为了获得最佳性能,必须确保顶点着色器中的纹理获取是本地化的并且始终在压缩纹理数据。

分拆绘制调用:
如果材质球对GPRs和/或纹理缓存的要求很高,则将绘制调用分成多个过程可能会提高性能。结果是否会是正面的很难预测,所以用现实世界中的两种测量方法是最好的决定方法。理想的,一个两次通过的draw调用将其结果与简单的alpha混合相结合,这对Adreno gpu来说并不重要,因为图形内存(GMEM)。
一些开发人员可能会考虑使用真正的延迟呈现算法,但这种方法有许多缺点,例如,必须解决GMEM,才能将前一个过程用作连续过程的输入。因为解析不是免费的,所以必须在算法的其他地方补偿性能成本。
理想情况下,使用Vulkan的RenderPass将有助于最小化GMEM解析,因此重构渲染算法以使用尽可能多的子类将是最佳方法。

发布了146 篇原创文章 · 获赞 28 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_38498942/article/details/103493122
今日推荐