Adreno Vulkan Application Optimizations(1)

一、简介
本篇文章将介绍在Adreno体系结构上帮助优化OpenGL ES应用程序的各种技巧。
在初始化期间生成管道,编译和链接着色器和构建Vulkan管道一样是一个耗时的过程。使用管道缓存并创建派生管道。

二、Vulkan优化
使用内置:
内置函数是OpenGL ES着色语言规范的重要组成部分,应该优先于编写自定义实现。这些函数通常针对特定的着色器配置文件和为其编译着色器的硬件的功能进行优化。因此,它们通常比任何其他实现都要快。
gl_VetexID和gl_InstanceID已经被移除,但gl_InstanceIndex可用。 glPosition、gl_PointSize、gl_ClipDistance、gl_CullDistance在非碎片阶段可用。有关vulkan中GLSL内置组件更改的详细信息,可以到GL_KHR_vulkan进行具体的查找。
使用适当的数据类型:
在代码中使用最合适的数据类型可以使编译器和驱动程序优化代码,包括着色器指令的配对。
使用vec4数据类型而不是float可能会阻止编译器执行优化。小错误会对性能产生重大影响。
另一个例子是,以下代码应采用单个指令槽:
int4 ResultOfA(int4 a)
{
return a + 1;
}
现在假设代码中引入了一个小错误。例如,使用浮点常量值1.0,它不是适当的数据类型:
int4 ResultOfA(int4 a)
{
return a + 1.0;
}
代码现在可以占用8个指令槽。变量a被转换成vec4,然后在浮点中进行加法。最后,将结果转换回返回类型int4。
同时建议减少执行的类型转换操作的数量。以下代码可能不太理想:
uniform sampler2D ColorTexture;
in vec2 TexC;
vec3 light(in vec3 amb, in vec3 diff)
{
vec3 Color = texture(ColorTexture, TexC);
Color *= diff + amb;
return Color;
}
(…)
这里,对纹理函数的调用返回一个vec4。有一个隐式类型转换为vec3,它需要一个指令槽。按如下方式更改代码可能会将指令编号减少一:
uniform sampler2D ColorTexture;
in vec2 TexC;
vec4 light(in vec4 amb, in vec4 diff)
{
vec4 Color = texture(Color, TexC);
Color *= diff + amb;
return Color;
}
压缩标量常量:
将标量常数封装到由四个通道组成的向量中,大大提高了硬件获取的效率。对于动画系统,这会增加可用于表面的框架。
考虑以下代码:
float scale, bias;
vec4 a = Pos * scale + bias;
通过按如下方式更改代码,可能只需要少一条指令,因为编译器可以将行优化为更高效的指令(mad):
vec2 scaleNbias;
vec4 a = Pos * scaleNbias.x + scaleNbias.y;
保持着色器长度合理:
过长的材质球可能效率低下。如果需要在材质球中包含与纹理提取数相关的多个指令槽,请考虑将算法拆分为多个部分。由算法的一部分生成供另一部分稍后重用的值可以存储到纹理中,然后通过纹理提取进行检索。然而,这种方法在内存带宽方面可能很昂贵。使用三线、各向异性过滤、宽纹理格式、三维和立方体贴图纹理、纹理投影、具有不同Lod的渐变的纹理查找或跨像素四元体的渐变也可以增加纹理采样时间并降低总体效益。

有效地采样纹理:
要避免纹理暂停,请遵循以下规则:
1、避免随机访问–硬件在2x2片段的块上操作,因此如果着色器在单个块中访问相邻的texel,则其效率更高。
2、避免3D纹理-从体积纹理获取数据非常昂贵,因为需要执行复杂的过滤来计算结果值。
3、限制从着色器采样的纹理数-在单个着色器中使用四个采样器是可以接受的,但在单个着色器阶段访问更多纹理可能会导致性能瓶颈。
4、压缩所有纹理–这允许更好的内存使用,将渲染管道中的纹理暂停转换为较低的数量。
5、考虑使用mipmaps–mipmaps有助于合并纹理提取,并有助于提高性能,但代价是增加内存使用。
纹理滤波可以影响纹理采样的速度。滤波器性能取决于体系结构/芯片,开发人员可能会看到在某些体系结构中使用三线性或各向异性的双线性或最近滤波的好处。Mipmap钳位可以降低使用三线滤波的成本,因此在实际情况下平均成本可能更低。添加各向异性过滤与各向异性程度相乘;这意味着,16x各向异性查找可能比常规各向同性查找慢16倍。但是,由于各向异性过滤是自适应的,因此此命中仅针对需要各向异性过滤的片段。可能只有几个碎片。对于现实世界中的情况,经验法则是各向异性滤波的平均成本不到各向同性滤波的两倍。
立方体贴图纹理和投影纹理查找不会产生任何额外成本,而基于dFdx和dFdy函数的特定于着色器的渐变会产生额外成本。这些特定于着色器的渐变不能跨查找存储。如果在同一个采样器中使用相同的渐变再次进行纹理查找,将再次产生成本。

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

猜你喜欢

转载自blog.csdn.net/weixin_38498942/article/details/103493107