网格优化:溃堤之穴,一个也不能放过

网格优化:溃堤之穴,一个也不能放过

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

今天,我们来继续剖析【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%的对手!》