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解析,因此重构渲染算法以使用尽可能多的子类将是最佳方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值