在UWA推出的适用Unreal项目的本地资源检测版本中,项目团队可以将其作为规范和完善项目资源品控流程的重要一环,添加到Unreal项目的研发持续集成、持续交付流程中,实现本地资源检测的“资源场景全覆盖,一键式自动扫描”。
本文中,我们将针对“基本资源”模块中的纹理和材质检测,为大家讲解相关的规则。
Part1、尺寸过大的纹理
在开发过程中,常见的和纹理尺寸相关的问题有:
“迪拜刀法”:引入大尺寸纹理,但实际使用、复用的区域,只占纹理中很小一部分;
“供过于求”:纹理品质大于效果需求。比如在像素类游戏中却使用了天文级星空图当背景,又或者512x512足够展示细节的情况下,却选用了1024x1024的相同纹理。
所以,本条规则可以帮助团队从海量资源中,将大于阈值设定的纹理资源单独检索出来,便于进行进一步的排查。需要说明的是,规则中检测的纹理尺寸数据来源有两个:“纹理本身尺寸”和“最大纹理尺寸”:
当“最大纹理尺寸”为0时,规则以“纹理本身尺寸”为判定依据;
当“最大纹理尺寸”不为0时,规则以两者间较大的为判定依据。
Part2、透明像素占比过高的纹理
纹理的Alpha通道一般用来表示透明度,当其设置为0时,贴图的视觉表现就是“透明”,不会对上下层的展示效果产生视觉影响。
如图所示,贴图中只有下方的部分区域才属于“有用区域”,其余大部分都是无用或不影响使用的透明区域。所以,如果一张贴图中Alpha为0的像素区域占比过大,就说明其实际有用区域只占很小一部分,由此造成了不必要的浪费。
本条规则会筛选出那些“透明像素数量占比大于像素总数量50%”的纹理,以供团队进行深层的判断和设置,对于被判定为失败的资源,美术成员可以根据实际情况裁剪掉这部分透明区域,尽量只保留有用的纹理部分,或者进行更合理的制作和修改,从而达到纹理资源的有效利用。
Part3、开启Never Stream的纹理
Unreal在纹理处理上有个机制叫做“纹理流送”(Texture Streaming),即基于纹理的Mipmap技术,为了优化Texture对于内存的占用而存在,对于生成了Mipmap的纹理,会根据一套规则来计算纹理资源所需要的理想的Mipmap层级,结合内存池的大小,来对纹理进行动态地流式送入、送出内存,这样就避免了纹理的所有Mipmap都进内存。
如果纹理资源开启了“Never Stream”选项(也就是关闭了“纹理流送”),则意味着纹理所有的Mipmap就会像俄罗斯套娃拆开一样,一股脑全塞进缓存池中,从而占据大量内存空间,进而影响项目性能。
项目中某些有特定展示需求的纹理,会选择开启“Never Stream”,以内存和性能上的牺牲来避免画面失真。而通常情况下,纹理都是保持不勾选状态以确保“纹理流送”机制的正常运作。所以,在对本条规则筛选出的纹理进行排查和修改时,团队需要注意这部分特殊资源,以避免误操作。
Part4、包含无效透明通道的纹理
Alpha通道通常被理解为图像的“透明度”,它是除R(Red)、G(Green)、B(Blue)以外的一个通道,取值为0到255。一个像素的Alpha值常用来表示像素是否对图片有“贡献”,经过运算之后,其外在表现是“透明度”。我们在纹理格式中见到的“RGBA”指的就是纹理的四个通道R、G、B和Alpha。
像素的RGB值与Alpha值的关系,可以简单理解为“相乘”:将Alpha的取值区间量化为0~1,那么当某个像素的Alpha值从0逐渐变化到1时,展示的效果就是从“完全透明”转变为“完全不透明”状态。
所以,当一张纹理上所有像素的Alpha值都为1时(若用0~255的范围表示,为255时),那么在渲染的计算过程中,关于该纹理Alpha值的计算就不会对纹理的展示效果造成任何影响(毕竟是乘1),透明通道的存在就是无意义的,这就会导致了内存上和计算上不必要的开销。
针对这些筛选出来的纹理资源,无特殊要求时,建议团队只需取消纹理的Alpha通道勾选即可。
Part5、纯色纹理
当项目中存在对单一颜色的采样需求时,团队成员很有可能顺着“出一张对应纯色的纹理 - 弄出个对应的材质 - 直接拖到需要着色的物体上”这种惯性思维去操作。
但在实际操作中,团队可以通过添加常量实现同样的效果,从而将本属于这个纯色纹理的内存占用和计算耗时直接省出来。
Part6、过滤模式为Trilinear的纹理
对于纹理,大部分情况下,我们都是要把它作为“一层皮肤”去贴到图形表面。在为图形“上色”的阶段,Unreal会利用像素对应的UV坐标对纹理进行采样,采样过程可以笼统地理解为“贴皮肤”的过程。在这个过程中,纹理常常会被“放大”、“缩小”或“变形”。纹理在图形表面就会出现模糊或者锯齿化的现象,从而降低整体的表现效果。为了降低放大或缩小对纹理表现带来的“失真”影响,过滤模式应运而生。
双线性过滤模式(Bilinear),它会对相邻的像素进行模糊化处理,使得像素之间的变化更为圆润平滑,不会有明显的锯齿感或者马赛克化。但这只涉及单个“平面”的操作,一旦涉及Mipmap层级间的处理,双线性过滤就会有些“力不从心”,某些表现效果会大打折扣。
三线性过滤模式(Trilinear),和双线性模式类似,但是额外优化了Mipmap层级间的转换效果,它会在Mip层级间进行插值处理,弥补了Bilinear模式的不足。
默认(自纹理组),在纹理的层次细节设置中有一项叫做“纹理组”,可以简单理解为Unreal按照纹理可能的用途,提供了很多种预设方案。项目成员在导入纹理时,可以通过纹理组的选择,将纹理快速分门别类,应用相关的设置,便于统一管理。
Trilinear模式对表现效果的提升,是以GPU的额外开销为代价的。同等条件下,三线性过滤的GPU占用是最高的。所以,如果对纹理的细致程度不那么敏感(比如像素类游戏),或者不涉及Mipmapping的应用(比如2D游戏),那么就没有必要去选择Trilinear模式。
所以,建议团队对本条规则检测下的纹理资源,依据项目实际需求进行相关的过滤模式的修改。
Part7、包含透明边缘的纹理
和前面的“透明像素占比过高的纹理”类似,如下图所示,当纹理四周出现条带状透明像素区域时,这部分区域对纹理的展示效果并没有积极意义。
所以,当纹理边缘存在这种长度与纹理尺寸相同、宽度占比超过纹理总宽10%的、完整矩形透明区域时,我们认为该纹理包含透明的边缘(四个边中任意有一个边),本条规则会判定为失败,方便美术成员对其进行进一步的优化。
Part7、包含纯色纹理采样的材质
和之前“纯色纹理”的原理类似,本条规则是从材质角度,帮助团队找到那些“漏网之鱼”。针对被筛选出的材质资源,同样地,团队可以通过本文之前说过的添加颜色值的方式,来避免不必要的开销。
以上是8条检测规则,希望能帮助大家在Unreal项目的日常开发过程中更好、更高效地理解和使用。“资源规则,全局设置、关卡(场景)”模块内的其余规则,我们将在下一期为大家讲解,敬请期待。