Unity场景美术资源优化

内容纲要

作者:乔长磊 转自 http://gad.qq.com/article/detail/32886

 概述:

在游戏制作中,绝大部分游戏的场景美术资源都会占用设备相当大的储存和计算量,而且游戏运行起来还有其他如角色、动画、特效、UI、贸易和战斗交互及AI、寻路等程序系统的调用和运行。对场景美术资源进行一定的优化就可以为其他资源留出更多的空间,使得游戏跑起来更为流畅。

unity这个游戏引擎在大部分移动平台上对游戏场景美术资源量的支持还是很高的。在主流的手机上(骁龙835芯片手机或IPHONE7)纯美术场景同屏面数30万左右运行流畅,游戏实际制作中控制在5-6万面以内应该没什么压力。当然根据不同类型游戏和使用的不同技术制作的游戏对美术资源支持大小有所不同。

下面是一些用Unity引擎开发游戏时对场景美术资源优化的总结和基于U11手机用Unity开发VR内容的场景美术的优化测试。

主要从模型、贴图、灯光、镜头和场景设定几个方面讲述。

一、模型

①减面:对场景模型减面优化是最常见的优化操作。主要是去掉对模型造型没有影响的面,用尽可能少的面数表达清楚模型的结构和造型。比如:物件非关节点及物件背面、内部不会看见的面删掉。 

②合并模型:合并同一小范围内的非交互类的静态小物件,同时合并小物件的贴图。这样可以减少DRAW CALL的数量。如,一组不同大小的小草,一组大小形状不同的石头,一个书架和上面放置的很多书籍等。把这些小物件合并成一个object,贴图也合成成一张贴图。高端手机平台上draw call一般控制在300左右。

③LOD:建筑和复杂的物件用LOD模型和远处剔除来减少同屏面数。地形的LOD系统也可以对地形的面数做很大的优化。

④模型的重复利用:相同的多个物件在unity内复制使用,复制的多个物体在引擎计算上算一个物体。但也不可复制太多个,太多会对内存带来很大压力。相同的物件太多,建议把几个合并成一组做为一个Object,多做几组,再进行复制。参考②。

⑤地形优化:如果是用unity自带的地形工具制作的地形,可以用T4M插件转化成T4M格式地形,设置一个顶点值转化后可以对地形优化很多。T4M也可以设置lod模型。

以我做过的一个测试为例:优化前,地形是1000*1000的。就是(1000-1)*(1000-1)=998001(面),将近100万面。转化顶点值设为100,转化后的面为19602,才近2万面。

二、材质贴图

①贴图大小:在移动设备上的贴图最大要控制在1024和512大小,可少量使用2048大小的贴图,以1024、512大小贴图为主。

②重复贴图的使用:大面积相同材质使用1-3种贴图交替重复覆盖,通过光影变化打破贴图的重复感。

③ 小物件的贴图合并,上文有讲,单个物体的贴图最好是一张,最多不易超过3张。相同贴图的材质球统一。

④ 少用透明贴图,能不用就不要用。透明贴图非常消耗GPU资源。

⑤支持Mipmap, Mipmap 会增加游戏包体的大小和占用一定量的内存,但在游戏中Mipmap的渲染可以减少显存带宽,降低渲染压力,随着相机的推远贴图会随之切换成低像素的体贴,从而节省资源开支。过的Mipmap使用会对内存造成很大压力,因此建议只对大物件设置Mipmap。   

(unity会根据相机距离由近到远生成8张像素逐渐降低的贴图,这里只截取了5张,从左往右依次是原图至Mipmap生成的低像素贴图)

⑥小场景可以用PBR材质,用PBR材质就一定要用实时灯光才有效果。大场景避免使用PBR材质,大场景尽可能用烘焙光影来达到光照效果。烘焙的场景模型就不要用法线贴图了,贴了也没效果,还占空间资源。

⑦贴图压缩,对贴图进行PVRT(Ios)或是ETC(Android)格式的压缩可以减少大量内存消耗。

        

⑧建议场景的材质可以用substance材质系统转成.sbsar 格式材质。 Substance材质可以大大压缩贴图数据的大小但不损失贴图质量。

        

如下图所示:33.8MB的.tga格式贴图制作成.Sbsar格式材质之后只有3.8MB。

三、灯光   

1、灯光的数量:室外开放式大场景建议只用一盏平行光。室内场景可适当多一点,室内环境可以用reflection probe来加强反射效果。

2、场景烘焙:大场景和比较复杂的室内场景要避免实时灯光的使用。利用UNITY的烘焙系统把光影烘焙成贴图来实现光影效果。烘培贴图本身是一个浩大的工程,大场景的烘培可以选择性的去烘焙。UNITY里自动分UV功能不好控制,所以一般在max\Maya里分好第2套UV,也可以直接在max\Maya里烘焙好lightmap导入到unity里。

UNITY提供了混合模式灯光,所以我们可以用混合灯光来实现LIGHTMAP与实时灯光结合。既:一个大场景中,大件如建筑、地形占据画面较大的物件烘焙lightmap,小物件繁多,占据画面的面积很小可以不用烘焙,把灯光设置为mixed模式。

四、其他

①摄像机上少用镜头效果,有选择性的使用。

②特殊的Shader慎用。

③美术资源的优化可以从最早设定场景的时候就开始考虑。如ARPG游戏的关卡根据情况能用管道式的场景就避免设定成全开放式的室外场景。

(这是仙剑奇侠传5的场景和地图,根据剧情需要着重制作路径两边的场景,其他地方利用障碍遮挡,使玩家不能过去,就可以概括简化交代一下。)  

 

④在陆地上玩为主的游戏就避免设计飞到空中的设计。在近空俯视场景非常耗资源。

     

⑤开放式大场景中从设计上就要避免有过多的可破坏性物件,场景中可交互的点要清晰,避免大而全的设计,要注意取舍。

(这也是仙剑奇侠传的一个小镇场景,可交互的点很清晰,其他建筑NPC交互就可简化制作或者不做交互。)

我做过的一个场景优化测试的数据如下:

优化前:

1、这个场景使用UNITY自带地形,上面有大量的植被草地,30多栋废弃建筑,地上和建筑上有繁多的植被野草、废纸、酒瓶、石块等,横竖大小10条街道左右,街上有大量路灯、路牌、油桶等细节。

2、场景本身用了LOD系统。

3、总体面数在200多万。小物件在15000多个。

在PC上跑起来帧数只有40多帧,在835芯片手机上画面严重卡顿,跳帧严重。

优化方案:

1、把地形用T4M插件转化成T4M格式,大规模减少远处树木植被。优化下来提高了5帧左右。

2、街道上的小物件删减和合并,原场景中界面上小物件过多,路灯过密,做了适当删减,对小范围内的小物件模型进行模型和贴图的合并。大概提高7帧左右

3、透明贴图的减少,原场景是废墟,所以建筑上用了大量的透明题图做藤蔓,对渲染消耗太大,进行适度删减,大概删掉一半,提高10帧左右。

4、对建筑,街道和大地形、大物件进行了lightmap烘焙。小物件用灯花的混合模式实时照明。大概提高30帧左右

5、减少原场景中的镜头特效。原场景中镜头特效用了7个,关掉了Antialiasing As Post Effect、Vignetting、SSAO三个镜头效果,这三个特效对画面影响较小,大概提高了10帧左右。

最终优化后面数为70多万面。FPS为100帧左右。

总结:

美术场景资源的优化主要从模型、贴图、灯光、特效等方面去着手,对应的是提高CPU、GPU、内存等硬件的使用效率。优化的细节还有很多,比如场景特效可尽量用动画去实现,避免过多的粒子特效,场景的碰撞体单独用建模去做不要用unity默认的碰撞体等等。一个游戏的后期优化是多方面的,包括场景、角色、动作、特效、音效、动画、AI及程序运算等等,场景上能多优化一点,就可以给其他资源让出一点空间。

发表回复