纹理优化:不仅仅是一张图片那么简单

在上期《网格优化:溃堤之穴,一个也不能放过》中,我们对网格相关的优化知识点做了讲解。无论是大家在开发时的疏忽,还是对相关知识点的理解不足,这些问题的积累最终都会反映到项目的性能表现上。为此,我们将这些规则列出,并且以一个个知识点的形式逐一解读。

本期我们聚焦纹理相关的优化,以UWA本地资源检测“包含无效透明通道的纹理”“过滤模式为Trilinear的纹理”“开启Read/Write选项的纹理”这三条规则,来为大家简单说明相关的优化要点。我们将力图以浅显易懂的表达,让职场萌新或优化萌新深入理解。


1、包含无效透明通道的纹理

纹理优化:不仅仅是一张图片那么简单_第1张图片

首先,Alpha通道是个计算机图形学术语,常常被理解为图像的“透明度”。 其实Alpha本身没有透明度的意思,Alpha通道指的是除R(Red)、G(Green)、B(Blue)以外的一个通道,取值为0到1。一个像素的Alpha值常用来表示像素是否对图片有“贡献”,经过运算之后,其外在表现是“透明度”。我们在纹理格式中见到的“RGBA”指的就是纹理的四个通道R、G、B和Alpha。
纹理优化:不仅仅是一张图片那么简单_第2张图片

简单来讲,像素的(R,G,B)值与Alpha值通常是相乘的关系,当某个像素的Alpha值为1时,则表现为完全不透明状态。如果一张纹理上所有像素的Alpha值都为1,那么在渲染的计算过程中,关于该纹理Alpha值的计算就是无意义的,这就会导致了内存上和计算上不必要的开销。

所以本条检测规则筛选出Alpha值全为1的纹理后,建议开发团队去除相应纹理的Alpha通道。


2、过滤模式为Trilinear的纹理

纹理优化:不仅仅是一张图片那么简单_第3张图片

对于纹理,大部分情况下,我们都是要把它作为“一层皮肤”去贴到图形表面。在渲染管线的逐片元着色阶段,会对利用屏幕上像素对应的UV坐标对纹理进行采样,采样过程可以笼统地理解为“贴皮肤”的过程。在这个过程中,纹理常常会被“放大”、“缩小”、“变形”。纹理在图形表面就会出现模糊或者锯齿化的现象,从而降低整体的表现效果。为了降低放大或缩小对纹理表现带来的“失真”影响,过滤模式应运而生。
纹理优化:不仅仅是一张图片那么简单_第4张图片

过滤模式会提供多种方案来使得纹理投影到物体表面的过程变得更为顺滑自然。一般来讲,Unity提供了三种模式:

Point(no filter)——Point模式为不过滤的采样方式,使用最近点采样的方法,当UV坐标没有刚好对应Texture上的一个采样点时,它会选择最近的一个采样点作为该坐标的采样值。当纹理没有拉伸变形时,这样速度是最快的,且效果理想。但如果拉伸变形了,会出现马赛克现象。

Bilinear——双线性过滤模式。简单来讲,它会对相邻的像素进行模糊化处理,使得像素之间的变化更为圆润平滑,不会有明显的锯齿感或者马赛克化。但这只涉及单个“平面”的操作,所以一旦涉及mipmap层级间的处理,双线性过滤就会有些“力不从心”,某些表现效果会大打折扣。

Trilinear——三线性过滤模式。和Bilinear模式类似,但是额外优化了mipmap层级间的转换效果,它会在mip层级间进行模糊处理,弥补了Bilinear模式的不足。

这里我们延伸讲一下关于“mipmap”的概念。简单来讲为了更好地应对纹理贴图在不同距离和大小情况下的表现效果,以提升渲染的速度和降低图像锯齿化的影响,Unity会以纹理原尺寸为基础,预设几个等比例缩放的“复制品”,在实际使用中会根据情况加载对应的mipmap贴图,从而提升渲染性能,放大缩小的过程也因为mipmap层级的选择而更为快捷。

回到规则本身,Trilinear模式对表现效果的提升,是以GPU的额外开销为代价的。同等条件下,三线性过滤的GPU占用是最高的。所以如果对纹理的细致程度不那么敏感(比如像素类游戏),或者不涉及mipmapping的应用(比如2D游戏),那么就没有必要去选择Trilinear模式。

所以建议开发团队对本条规则检测下的纹理资源,依据项目实际需求进行相关的过滤模式的修改。


3、开启Read/Write选项的纹理

有时项目的实际运用中,会对纹理进行读写操作。
纹理优化:不仅仅是一张图片那么简单_第5张图片

开启纹理的Read/Write选项后,就可以从脚本来访问纹理数据。内存中会产生一份纹理数据的副本,以便于对纹理进行实施的编辑和修改,以此来达成某些动态的纹理效果。所以如果相关纹理不涉及读写的操作,Read/Write选项的开启就会导致内存上额外的占用。
纹理优化:不仅仅是一张图片那么简单_第6张图片

大家可以参看上期《网格优化:溃堤之穴,一个也不能放过》中关于网格的读写权限,两者在Read/Write选项的开启关闭上很类似。所以开发团队可以对照着去理解纹理读写权限开关的实际运用环境,从而对本规则下选出的纹理进行对应的权限修改,以减少不必要的内存开销。

需要说明的是,每一项检测规则的阈值都可以由开发团队依据自身项目的实际需求去设置合适的阈值范围,这也是本地资源检测的一大特点。同时,也欢迎大家来使用UWA推出的本地资源检测服务,可帮助大家尽早对项目建立科学的美术规范。

纹理优化:不仅仅是一张图片那么简单_第7张图片

我们已支持Luacheck功能啦~
我们已支持粒子特效检测~
这么多实用贴心的功能
你们还没用起来吗?

万行代码屹立不倒,全靠基础掌握得好!

性能黑榜相关阅读

《那些年给性能埋过的坑,你跳了吗?》
《那些年给性能埋过的坑,你跳了吗?(第二弹)》
《掌握了这些规则,你已经战胜了80%的对手!》

你可能感兴趣的