在之前的《网格优化中,你遇到过哪些吃性能的设置》一文中,我们简单讲解了在项目开发过程中容易被忽略的网格相关的属性设置。无论是大家在开发时的疏忽,还是相关知识点的缺失,这些问题的积累最终都会反映到项目的性能表现上。为此,我们将这些规则列出,并且以一个个知识点的形式逐一解读。

今天,我们来继续剖析【UWA 本地资源检测】中和网格设置相关的规则:“Normal 属性的网格”“开启 Read/Write 选项的网格”“蒙皮网格骨骼数过大”。我们将力图以浅显易懂的表达,让职场萌新或优化萌新深入理解。


1、包含 Normal 属性的网格

本条规则针对的是网格的 Normal 属性。在实际运用中,如果网格涉及到了光照、阴影等的应用与计算,那么就需要在网格中导入 Normal 属性,以达到更好的例如高光、漫反射等表现效果。

和前文讲述的网格 Tangent 属性类似,Normal 属性导入后会对空间和加载性能造成影响。所以在不需要的情况下,我们最好去除网格资源冗余的 Normal 属性。


2、开启 Read/Write 选项的网格

如同 Tips 里面指出的,Read/Write 选项启用后,将会允许 CPU 对网格的顶点、三角形等属性进行读写,这就需要在内存中产生网格数据的副本,便于对网格进行实时的编辑和修改,用来达成例如某些网格的动态效果的展示。下图所展示的 Demo 就在 Runtime 使用脚本对 Mesh 属性进行了动态地修改:

开启 Read/Write 后,一个网格数据就会有接近 2 倍的内存消耗。不需要进行动态编辑和修改的网格一旦开启了 Read/Write 选项,就会产生不必要的内存开销。

本条规则会筛选出所有开启了 Read/Write 选项的网格,以供开发团队进行相应的选项关闭和优化。需要提醒的是,对于需要调用函数 StaticBatchingUtility.Combine 进行合批的 Mesh,以及部分 Unity 版本中粒子系统里使用到的 Mesh,它们的 Read/Write 选项依然需要保持开启。

UWA 曾对网格资源进行过相关的深度解析和对比测试,大家可以参考一下相关的文章:《Unity 加载模块深度解析(网格篇)》


3、蒙皮网格骨骼数过大

对于带有 SkinnedMeshRenderer 的模型,UWA 本地资源检测会扫描其绑定的骨骼。

如果模型的骨骼数量较大,那么在运行时会有较高的性能开销,从而对整体的项目性能造成影响。对于该规则目前 UWA 给的推荐阈值为 50,我们建议研发团队对模型的骨骼数进行限制,将该类美术资源的性能开销控制在一个合理的范围内。

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

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

性能黑榜相关阅读

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


↙↙↙阅读原文可查看相关链接,并与作者交流