下面我们继续高通Adreno架构应用优化的内容。
顶点着色器计算胜于片段着色器计算
通常,顶点数显着小于片段数。通过将计算从片段着色器移动到顶点着色器,可以减少GPU的工作量。这有助于消除冗余计算。
测量,测试和验证结果
查找瓶颈对于优化应用程序是顶点绑定,片段绑定还是纹理获取绑定而言都是必需的。在尝试使代码更快之前,请先测量性能。使用工具进行这些测量,例如Snapdragon Profiler甚至是软件计时器。不要仅仅凭直觉就假定某些东西运行得更快。修改代码以使其表现更好时,它可以禁用更有益的编译器/硬件优化。始终在更改前后测量时序,以评估为优化而进行的修改的影响。
首选统一缓冲区代替着色器存储缓冲区
只要只读访问足以满足需求,并且均匀缓冲区提供的空间量足够,则始终首选通过着色器存储缓冲区。在Adreno架构下,它们的性能可能会更好。如果在GLSL中对Uniform Buffer Objects进行了静态索引并且足够小以使驱动程序或编译器可以将它们映射到用于默认统一块统一的硬件恒定RAM中,则这是正确的。性能原因。
优化顶点处理
本节介绍可帮助优化Vulkan应用程序组织顶点数据的方式的技巧,使渲染过程可以在Adreno架构上有效运行。
使用交错压缩的顶点
对于顶点获取性能,交错顶点属性(“ xyz uv” | | xyz uv | …”,而不是“ xyz | xyz | … | uv | uv | …”),工作效率最高。交错顶点的吞吐量更好,而压缩顶点可以进一步提高吞吐量。延迟渲染为这些优化提供了优势。对于分箱优化,请考虑一个具有顶点属性和其他属性来计算位置的数组,以及另一个具有其他属性的交错数组。Vulkan着色器中目前不支持半浮点数。6.2.2考虑几何instancingGeometry实例化是一次在场景中渲染同一网格或几何图形的多个副本的实践。此技术主要用于树木,草丛或建筑物之类的对象,这些对象可以表示为重复的几何形状而不会出现过度重复的现象。但是,也可以将几何实例化用于字符。尽管在所有实例网格上都复制了顶点数据,但每个实例可能具有其他区分参数,例如颜色,变换或照明,均已更改以减少重复的外观。如下图所示 ,场景中的所有桶都可以使用多次设置的一组顶点数据,而不是为每个桶使用唯一的几何图形
纹理压缩策略
压缩纹理可以显着改善图形应用程序的性能和加载时间,因为它减少了纹理内存和总线带宽的使用。与台式机OpenGL不同,Vulkan没有为应用程序提供在运行时压缩纹理的必要基础结构,因此纹理数据需要脱机编写。Adreno GPU支持的重要纹理压缩格式为:
- ATC –支持RGB的专有Adreno纹理压缩格式
- ETC-仅支持RGB组件布局的标准OpenGL ES 2.0纹理压缩格式
- ETC2-支持R,RG,RGB和RGBA组件布局以及sRGB纹理数据的标准OpenGL ES 3.0纹理压缩格式
- ASTC-纹理压缩考虑到达到的压缩率
QTI建议使用以下策略选择纹理压缩格式:
- 如果可用,请使用ASTC压缩
- 否则,请使用ETC2压缩(如果可用)
- 否则,请选择以下压缩格式:
- 如果使用alphab,则为ATC。
- 如果不使用alpha
ASTC,则ETC是一种较新的格式,可能无法在所有内容创建管道中得到支持或优化。此外,在Adreno硬件上处理ASTC的sRGB格式要比使用RGBA格式更有效。以下是将纹理转换为Adreno的常用方法硬件:
- 设备上转换
- 预打包
- 下载
设备上转换涉及游戏启动时发生的耗时的一次性纹理资源转换。预包装正确的纹理可获得最优化的解决方案,但每个GPU都需要APK的替代版本。下载需要GPU检测和互联网连接,但允许对每个GPU的确切纹理格式进行更多控制。无论哪种情况,第一步都是创建压缩的纹理。可以使用AdrenoTexture压缩和可视化工具或Adreno纹理转换器工具将纹理数据压缩为这些纹理压缩格式中的任何一种,这两种工具都包含在OpenGL的Adreno SDK中。
几何体实例化
几何体实例化是一次在场景中渲染同一网格或几何体的多个副本的实践。此技术主要用于树木,草丛或建筑物之类的对象,这些对象可以表示为重复的几何形状而不会出现过度重复的现象。但是,也可以将几何实例化用于字符。尽管在所有实例网格上都复制了顶点数据,但每个实例可能具有其他区分参数,例如颜色,变换或照明,均已更改以减少重复的外观。如图6-1所示。 ,场景中的所有桶都可以使用多次设置的一组顶点数据,而不是为每个桶使用唯一的几何图形