纹理优化:让你的纹理也“瘦”下来

纹理优化:让你的纹理也“瘦”下来

在上一期《纹理优化:不仅仅是一张图片那么简单》中,我们针对纹理相关的优化,挑选了部分知识点分析。无论是大家在开发时的疏忽,还是对相关知识点的理解不足,这些问题的积累最终都会反映到项目的性能表现上。为此,我们将这些规则列出,并且以一个个知识点的形式向大家逐一解读。

本文,我们继续聚焦纹理方面,以UWA本地资源检测中的检测规则:“开启Mipmap选项的Sprite纹理”、“用非压缩格式的纹理”和“Wrap模式为Repeat的纹理”为大家简单讲解相关的知识点。我们将力图以浅显易懂的表达,让职场萌新或优化萌新深入理解。


1、开启Mipmap选项的Sprite纹理

对纹理而言,在Import Settings中开启Generate Mip Maps后,Unity就会预生成一系列长宽以2为倍数缩小的纹理序列,一直生成到分辨率为 1*1,在采样纹理时会根据图形的大小自动选择相近等级的Mipmap进行采样。

在3D场景中,由于距离问题,物体的纹理需要经常被缩放、拉伸,所以使用Mipmap会减小运行过程中的计算量,提升GPU效率。

需要注意的是,开启Mipmap选项后,生成的多个小分辨率纹理会使得总体内存占用比原来多出1/3。在UI中,由于不存在元素相对于相机的位置不断变化的需求,一般情况下也不需要频繁缩放图片(特殊需求除外),所以对UI而言Mipmap的存在对性能提升其实是没有意义的。

本条规则的主角——Sprite类型的纹理,就是应用在2D游戏或者UI当中的,所以我们不建议开启Mipmap,以避免造成内存上的浪费。


2、使用非压缩格式的纹理

首先我们要区分图片文件格式和引擎中支持的纹理格式。对图片而言,诸如JPG、JPEG和PNG等多种文件格式是为了存储图像信息而使用的、对信息的特殊编码方式,它存储在磁盘中或者内存中。

但图片的这些格式,对于以向量计算见长的GPU来讲就有种面对陌生外语时的“无能为力”了。3D图形硬件不支持原始的图片文件格式,原始图片需要经过CPU转换成图形硬件支持的格式才能在实时渲染中使用。而这些可以被GPU识别的格式,就是我们要说的纹理格式。

我们可以在Format里设置纹理的格式。不同的设备与平台具有各自专有的支持的格式。RGB32/RGBA32/RGBA24/RGB24为非压缩的格式,能适用于多个平台和环境。这些格式显示效果较好,但内存占用较大,效率不高。因此我们建议在对图像质量要求不是特别高的情况下,尽量使用硬件支持的压缩格式。

这条规则会过滤出所有采用非压缩格式的纹理,开发团队需要基于相关纹理的实际使用需求和在相关平台上表现效果的考量,来决定是否需要进行压缩。

目前Unity支持的纹理压缩格式有ETC、ASTC、PVRTC和DXT等,各有不同的适用环境,在压缩的大小和保真度上也各有所长。对于压缩格式的使用,可以参考UWA问答上的帖子:https://answer.uwa4d.com/question/58d2943ae00cc20065a42597


3、Wrap模式为Repeat的纹理

一般而言,我们使用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%的对手!》