节前,我们已经将【性能黑榜】上的 Top10 规则均做了详细的解读(可戳文末相关链接回顾)。无论是大家在开发时的疏忽,还是相关知识点的缺失,这些问题的积累最终都会反映到项目的性能表现上。为此,我们将这些规则曝光出来,并且以一个个知识点的形式逐一解读。
今天,我们来继续剖析【UWA 本地资源检测】中和网格设置相关的规则:“包含 Color 属性的网格”,“未开启 OptimizeMesh 选项的网格”,“包含 Tangent 属性的网格” 和 “包含 uv3 或 uv4 属性的网格”。我们将力图以浅显易懂的表达,让职场萌新或优化萌新深入理解。
在一些建模软件中导出的模型可能会带有顶点的颜色属性,在 Unity 中即表现为 Mesh 的 Colors 属性。有些 Shader 可以使用这个属性进行运算与着色,如 Sprites Shader。然而大多数 Shader 都选择忽略 Colors 属性(Unity 标准着色器就不使用这个属性)。在这种情况下,如果 Mesh 带有 Colors 属性,那么对其本身而言没有实际意义,却会对内存、物理体积和加载性能造成影响。
所以本条规则会针对 Mesh 的 Colors 属性进行检测,以供开发团队根据实际使用需求去除不必要的 Colors 属性。
在此大家可以参考一下 UWA 问答中一位热心朋友提供的批量去除网格 color 属性的工具:https://answer.uwa4d.com/question/5a8f77970b827e2c0bfdcfaf
在模型方向上的网格应用是极为普遍的,在项目的性能开销上也占有很大的比重。所以对模型网格的优化也一直是首先考虑的重点。但很多情况下,对模型网格进行调优意味着需要对原有的设计与资源等进行大刀阔斧的改动,从而使得很多开发团队往往因为难以找到切入点而一筹莫展。
所以 Unity 为我们提供了一个优化选项:OptimizeMesh。
Optimize Mesh 是模型的 Import Settings 当中的选项。在开启状态下,网格的顶点或三角形会按照引擎本身既定的一套规则重新排序,从而使其对于 GPU 来说在运算时能有较好的性能。理论上如果模型对顶点和面片顺序没有要求的话,Optimize Mesh 的开启就不会导致显示问题。
所以 UWA 设置了这条检测规则,以方便开发团队找到这些未开启 OptimizeMesh 选项的网格并进行相关的设置优化。
本条规则,其实和上述的 “包含 Color 属性的网格” 那条规则的着眼点是一样的。Tangent 是网格中顶点的属性中的一项。很多情况下我们的 Shader 不需要使用这项属性,会造成内存上的浪费。
举个例子,如果项目中使用了 Normalmap,那么就需要在 Shader 里面计算局部的切空间,这种情况下就会用到网格的 Tangent 属性。
除此之外,如果不用 Normalmap,一般来讲网格的 Tangent 属性都是不会被使用到的。所以本条规则会遍历出包含 Tangent 属性的网格,开发团队在确认不会有相关的使用需求后,就可以在 FBX 的导入设置中取消 Tangent 属性的导入。
uv 坐标又称为纹理映射坐标 (texture-mapping coordinates),对应于每个顶点,用于确立模型表面的各个顶点的颜色采样与纹理上具体位置的对应关系。通俗来讲就是将一张图贴在模型表面,使得我们可以从 “纹理” 这块调色板上找到正确的颜色,来绘制模型。
Unity 一共支持 4 套 uv,在 c#API 中分别叫 uv、uv2、uv3 和 uv4。通常来说 (使用 c# API 中的命名),uv 用于主纹理,uv2 用于光照贴图 (Lightmap) 的采样,uv3 用于实时动态光照,uv4 可进行自定义。
uv2 可以在建模软件中添加,也可以在 Unity 中通过 Generate Lightmap UVs 的选项来生成。如果在建模软件中只做了一套 uv,将模型导入 Unity 的时候,在导入设置中勾选 Generate Lightmap UVs,Unity 会自动为我们生成用于光照贴图的 uv2。uv3 和 uv4 的使用较为少见,通常是用来配合特殊的 Shader 实现特殊的效果。
去除不必要的 uv3、uv4 属性可以有效降低模型所占空间资源,所以 UWA 用本条规则找出包含 uv3 或 uv4 的网格,由开发团队根据网格的实际使用需求和表现效果的平衡考量,去对网格的 uv 属性做减法。
需要说明的是,每一项检测规则的阈值都可以由开发团队依据自身项目的实际需求去设置合适的阈值范围,这也是本地资源检测的一大特点。同时,也欢迎大家来使用 UWA 推出的本地资源检测服务,可帮助大家尽早对项目建立科学的美术规范。
性能黑榜相关阅读
《那些年给性能埋过的坑,你跳了吗?》
《那些年给性能埋过的坑,你跳了吗?(第二弹)》
《掌握了这些规则,你已经战胜了 80% 的对手!》