在上一期《纹理优化:不仅仅是一张图片那么简单》中,我们针对纹理相关的优化,挑选了部分知识点分析。无论是大家在开发时的疏忽,还是对相关知识点的理解不足,这些问题的积累最终都会反映到项目的性能表现上。为此,我们将这些规则列出,并且以一个个知识点的形式向大家逐一解读。
本文,我们继续聚焦纹理方面,以UWA 本地资源检测中的检测规则:“开启 Mipmap 选项的 Sprite 纹理”、“用非压缩格式的纹理” 和 “Wrap 模式为 Repeat 的纹理”为大家简单讲解相关的知识点。我们将力图以浅显易懂的表达,让职场萌新或优化萌新深入理解。
对纹理而言,在 Import Settings 中开启 Generate Mip Maps 后,Unity 就会预生成一系列长宽以 2 为倍数缩小的纹理序列,一直生成到分辨率为 1*1,在采样纹理时会根据图形的大小自动选择相近等级的 Mipmap 进行采样。
在 3D 场景中,由于距离问题,物体的纹理需要经常被缩放、拉伸,所以使用 Mipmap 会减小运行过程中的计算量,提升 GPU 效率。
需要注意的是,开启 Mipmap 选项后,生成的多个小分辨率纹理会使得总体内存占用比原来多出 1/3。在 UI 中,由于不存在元素相对于相机的位置不断变化的需求,一般情况下也不需要频繁缩放图片(特殊需求除外),所以对 UI 而言 Mipmap 的存在对性能提升其实是没有意义的。
本条规则的主角——Sprite 类型的纹理,就是应用在 2D 游戏或者 UI 当中的,所以我们不建议开启 Mipmap,以避免造成内存上的浪费。
首先我们要区分图片文件格式和引擎中支持的纹理格式。对图片而言,诸如 JPG、JPEG 和 PNG 等多种文件格式是为了存储图像信息而使用的、对信息的特殊编码方式,它存储在磁盘中或者内存中。
但图片的这些格式,对于以向量计算见长的 GPU 来讲就有种面对陌生外语时的 “无能为力” 了。3D 图形硬件不支持原始的图片文件格式,原始图片需要经过 CPU 转换成图形硬件支持的格式才能在实时渲染中使用。而这些可以被 GPU 识别的格式,就是我们要说的纹理格式。
我们可以在 Format 里设置纹理的格式。不同的设备与平台具有各自专有的支持的格式。RGB32/RGBA32/RGBA24/RGB24 为非压缩的格式,能适用于多个平台和环境。这些格式显示效果较好,但内存占用较大,效率不高。因此我们建议在对图像质量要求不是特别高的情况下,尽量使用硬件支持的压缩格式。
这条规则会过滤出所有采用非压缩格式的纹理,开发团队需要基于相关纹理的实际使用需求和在相关平台上表现效果的考量,来决定是否需要进行压缩。
目前 Unity 支持的纹理压缩格式有 ETC、ASTC、PVRTC 和 DXT 等,各有不同的适用环境,在压缩的大小和保真度上也各有所长。对于压缩格式的使用,可以参考 UWA 问答上的帖子:https://answer.uwa4d.com/question/58d2943ae00cc20065a42597。
一般而言,我们使用 UV 坐标构建起模型表面在纹理上的对应采样关系,UV 坐标的采样范围在 0~1 之间。但实际开发过程中,有时会遇到 “在 UV 坐标 0~1 以外的范围进行采样” 的情况。
Wrap Mode 选项就是用来确定当纹理坐标(UV 坐标)超出 0~1 范围时如何采样的。形象点来讲,这种情况有点像是在画框里放入了一张尺寸比框小的画作,WrapMode 决定了以何种方式去填充画作与画框间的部分。我们将在这里介绍常用的两种方式:Repeat 和 Clamp。
在 Unity 中,Texture 的 Wrap Mode 默认是 Repeat。该方法以平铺的方式填满 “画框” 的剩余部分。对于如下图所示的一张纹理:
Repeat 模式的实际显示效果如下:
而对于 Clamp 模式,它会以 “画作” 边缘那一圈去采样填充满 “画框” 中剩余的部分。从 UV 坐标的角度而言,该模式会将大于 1.0 的数值设置为 1.0,将小于 0.0 的数值设置为 0.0。其显示效果如下:
那么我们为什么要将 Repeat 模式的纹理检测出来呢?因为在实现方法上,当 UV 坐标超出 0~1 范围时,Repeat 模式会忽略纹理坐标的整数部分,并将纹理图的拷贝粘贴在物体表面上。这就要求在纹理顶部的纹理单元应与底部的纹理单元相匹配,在纹理左侧的纹理单元也应与右侧的纹理单元相匹配,这样才能做到无缝连接。若无法满足两侧无缝衔接的要求,在最终显示的图像边缘会出现杂色,如下图所示:
所以从表现效果上讲,Repeat 模式有可能会使得纹理边缘看起来更不自然。所以在筛选出 WrapMode 中选择了 Repeat 模式的纹理后,开发团队要根据纹理的实际展示效果去选择合适的 WrapMode 模式。
希望以上这些知识点能在实际的开发过程中为大家带来帮助。需要说明的是,每一项检测规则的阈值都可以由开发团队依据自身项目的实际需求去设置合适的阈值范围,这也是本地资源检测的一大特点。同时,也欢迎大家来使用 UWA 推出的本地资源检测服务,可帮助大家尽早对项目建立科学的美术规范。
我们已支持 Luacheck 功能啦~
我们已支持粒子特效检测~
这么多实用贴心的功能
你们还没用起来吗?
万行代码屹立不倒,全靠基础掌握得好!
性能黑榜相关阅读
《那些年给性能埋过的坑,你跳了吗?》
《那些年给性能埋过的坑,你跳了吗?(第二弹)》
《掌握了这些规则,你已经战胜了 80% 的对手!》