在上一期《场景检测:Audio Listener、RigidBody 和 Prefab 连接》中,我们依托本地资源检测中和场景检测相关的规则,把涉及到的知识点讲解。这些看似细小的知识点,很容易在开发和学习过程中被疏忽,而长期的问题积累最终都会反映到项目的性能表现上。为此,我们将这些规则列出,并且以一个个知识点的形式向大家逐一解读。
本期,我们将继续讲解目前场景检测中剩余的规则:“场景总顶点数过大”、“场景总面片数过大”、“阴影分辨率设置不规范的灯光”、“检测场景中的 Rigidbody” 和 “场景中 MeshCollider 使用的总面片数过多”,我们将力图以浅显易懂的表达,让职场萌新或优化萌新能够深入理解。
如果说现实里的万事万物都是由原子分子构成,那么在 Unity 中,“点” 与 “线” 的组合就构成了这个虚拟世界的基础。就算是一个看上去无比圆润的球体,究其根本也是由大量 “点—线” 组合的三角形面片构造而成。
一般来讲,如果对场景的质量要求越高,那么场景中的元素就会越多、模型也会越精细。相应地,开发团队就需要使用更多的面片去构建地形、角色模型等,用更多更复杂的做法来渲染相应的元素,以满足场景内高质量的需求。
而随着场景内顶点数、面片数的上升,在项目中 Unity 就需要花费更多的内存去记录相应的顶点以及面片信息,并且在渲染时也会消耗更多的运算资源以达到预期效果。
一方面,大量的顶点与面片为场景带来了不可忽视的内存和渲染压力;另一方面,由于没有在这种数量上有个明确的 “红线”,一些很明显的优化做法也容易被开发团队所忽略。例如对作为背景的远处物体,本可以通过降低三角面数的做法来减少性能开销;一些数量大但非必要的场景物体,某些情况下甚至可以不用模型,转去用平面纹理也达到同样效果等。
所以借助这两条规则,开发团队能对场景内的元素与复杂程度有个较为明确的概念。针对筛选出来的场景资源,开发团队要根据实际的性能需求去对相关的顶点、面片使用做精简。
在 Unity 中,开发团队可以通过对光源和相应的阴影效果进行设置,以达到对现实光影的模拟或者某种特定的光影表现,从而提高场景的渲染质量与展示效果。我们可以很方便地对 Directional Light、Point Light、SpotLight 等多个类型的光源进行相应的阴影效果设置。
很有意思的是,Unity 还提供了一个全局性的质量设置(Quality Settings)。路径一般是 Edit—>Project settings—>Quality。我们也可以在这个界面对场景内的光影效果进行相关的设置。
不过在这里我们聚焦在一个更具体的方面:Shadow Resolution。在 Quality Settings 中,如下图,Unity 提供了四种 Resolution 可供选择:
而在光源的 Shadow 设置内,相较而言会多出一个 “Use Quality Settings” 的选项,以方便具体的光源直接采用 Quality Settings 里的设置:
从规范开发的角度讲,一般两个地方的设置是保持一致的;如果特定灯光的分辨率设置与 Quality 设置里面的不一致时,就会导致有的地方分辨率高,有的地方分辨率低。就如图所示,不同的阴影效果的差别非常明显,从而破坏了整个场景的光影和谐性,使得场景的光影效果处于一种不协调的状态。
所以开发团队在进行灯光的阴影设置时,要充分考虑到 Quality Settings 为场景确立的大方向,尽量使得光源的阴影设定与 Quality Settings 保持一致,以避免造成冲突导致场景效果打折扣。
在上一期的文章《场景检测:Audio Listener、RigidBody 和 Prefab 连接》中,我们对刚体有过简单的介绍。本条规则就不再局限于静态物体,而是将范围扩大到了整个场景。
问题的精髓还是一样的:作为对现实物理属性在虚拟世界中的展现,场景中的物体是否有必要添加上 Rigidbody 以实现相应物体对物理效果的模拟?
所以在本条规则筛选出场景内带有 Rigidbody 的物体后,开发团队要根据对应物体的实际使用情况,对挂载的刚体进行保留或去除,以及勾选相关的优化项。
同样的,在介绍场景规则的第一篇文章《场景检测:雾效、Canvas 和碰撞体》中,我们对 Mesh Collider(网格碰撞体)进行了相应的讲解。
不同于 Unity 中其他几种简单的预制碰撞体,Mesh Collider 以 “实现更为精准的碰撞反馈” 为目的,将碰撞反馈的范围尽可能地与目标物体的表面形成贴合。碰撞效果相对于立方碰撞体或者球形碰撞体等而言,反馈会更为拟真,但代价是更复杂的碰撞计算和更高的性能开销。
一般而言,构成 Mesh Collider 的面片数量越多,它所占用的物理开销也会越高。本条规则会找到场景中所有的 MeshCollider 组件,统计面片数总和。开发团队可以从 “精简物体三角面片数” 和 “换用相对简单的碰撞体” 这两条思路去考虑对相应的场景进行优化。
希望以上这些知识点能在实际的开发过程中为大家带来帮助。需要说明的是,每一项检测规则的阈值都可以由开发团队依据自身项目的实际需求去设置合适的阈值范围,这也是本地资源检测的一大特点。同时,也欢迎大家来使用 UWA 推出的本地资源检测服务,可帮助大家尽早对项目建立科学的美术规范。
万行代码屹立不倒,全靠基础掌握得好!
相关推荐
性能黑榜相关阅读
《那些年给性能埋过的坑,你跳了吗?》
《那些年给性能埋过的坑,你跳了吗?(第二弹)》
《掌握了这些规则,你已经战胜了 80% 的对手!》