2.4 模型
模型特别是带有骨骼动画的模型在性能消耗中占据非常大的比重,它们会显著增加CPU/GPU/内存/显存的负担。所以,模型的优化尤为重要。模型涉及的数据比较多,包含了顶点/索引/材质等,而顶点又可能包含pos/color/uv/normal/tagent/skin等数据,我们可以从这些数据着手优化。
上图的模型顶点包含了pos/color/uv/normal/skin等数据。
2.4.1 模型数据
- 模型的顶点数据通常包含pos/uv,但color/normal/skin等数据视不同类型的物件区分对待。比如,对于静态物体,可以去除skin;如果无需顶点变色,则可以去除color。
- 模型内pos.xyz/uv.xy/color.rgba等等数据默认用32位浮点数存储,它们的数据表示范围远远超出大多数游戏的应用场景,可以将它们压缩至16位浮点数。
- 模型的索引数据存储了三角形引用的顶点序号,默认用32位unsigned int存储,但绝大多数模型不可能超出16位unsigned short的范围,故用16位整型足矣。
- Unity引擎在Model的Import面板可设置优化参数(下图)。
2.4.2 模型辅助工具
美术制作出的模型通常是高精度模型,虽然效果好,但往往在中低端机不需要这么高的精度,这时候就要借助一些工具进行优化。下面主要介绍Unity的工具,其它引擎应该有类似的工具。
- MeshBaker:模型合并插件,可以对多个模型合成一个模型,从而减少模型个数,降低Draw Calls。多用于静态物体合并,比如场景和地面静态物体。
- SimpleLOD:模型减面库,可以离线或运行时给模型进行减面优化,也可以方便地做成批处理工具。
2.4.3 模型美术规范
一个模型尽量只用一个材质,材质使用的贴图大小要合理,太大浪费内存,太小画质会模糊。建模时,剔除模型内部等不可见的顶点和三角面,合并重叠或相邻的顶点,减少模型的顶点数和面数。为防止美术制作的模型精度过高,有必要对模型的顶点和面数做限制。若模型带骨骼动画,需对骨骼数量做限制,单个模型的骨骼数量最好限定70个以内,否正很多低端设备无法支持GPU蒙皮。对模型进行分类,重要模型骨骼数可以多一些,次重要或不重要的更少骨骼数。游戏Z对各类模型的限制如下表:
2.5 场景
-
地形若是不复杂(比如王者荣耀/LOL的战斗场景),尽量不用Terrain,用简易模型代替,地表细节可用一张纹理表示,地表纹理取合适大小,通常不超过1024x1024。
-
地形网格和地面静态物体去掉阴影,如果某些物件确实需要阴影,可以让美术在制作地表纹理时加上阴影。
-
地形有很多不可见的地方,可以删减那里的模型网格。
-
地面通常有很多装饰物和特效,要关注它们的面数等规格是否超出了限制。
-
一个场景只用一个平行光,实时像素光不要超过一个。用Lighting Map代替实时光,Lighting Map纹理尺寸不宜太大。
-
对场景的面数和物体数量做限制。使用合批工具离线将地表相似的静态物体合并,减少场景复杂度。
-
对场景使用画质分级策略,比如低画质下,用最低模的场景,隐藏场景特效等。
-
地表如有导航网格,导航网格可以采用更精简的模型,复杂的边缘可以简化成简单的几何多边形。
上图展示的是游戏Z的一个场景,虽然地表物体比较复杂,但地形网格(绿线所示)很简单,用少量的三角面表示了复杂的地表构造。