开发VR游戏怎样优化大场景,分享几点技巧
发表于2016-05-17
近几年,游戏品质越来越高,场景越来越丰富,表现越来越绚丽。国内的美术团队一直在这条路上慢慢成长。那么我们怎样做大场景呢?怎样优化大场景呢。不同平台有不同的方法,接下来隔壁老王就来分享一下他的方法。尤其是VR游戏,又是双倍渲染!
一、Unity5.0+多场景编辑
举个例子:
U5.0+支持多场景编辑和加载,如果你的游戏需要很大很大一个场景,比如魔兽世界这种场景,就可以按照地形设计,把地形分成N个区域,按需加载即可,比如说向魔兽世界这种大场景,走到一定的区域加载一些场景,卸载老场景。场景资源都是按照自己的Scene单独管理,LightingData数据也会按需加载卸载。单独一个小Scene也要场景物件的容量,要不加载起来会很卡。这种方法类似UE3的多场景管理,一个主场景其他的都是子场景。
二、单个大场景使用相同材质和相同贴图的尽量合并成一个Mesh,数量巨大的OBJ,会降低游戏帧数,尽量别让Unity自己整合了。
场景中虽小的“砖块”虽然Unity会自动整合,但是还是会对CPU有很大开销,建议众多细小Mesh合并成一个Mesh
从Unity3.0+,官方就明确指出来,在移动端一个Mesh最好对应一个材质球,老版本的DrawCall数量越低越好,新版本需要参照的参数就比较多了,从优化方面,就从这几点开始入手吧。
大场景中细小的物体碎小的物体,美术只能盖楼式的做场景。最终留下的是单个小砖块,这些小砖块Unity虽然会自动给整合成一个大的MESH,但是架不住你的砖块太多啊,这方面的计算也是消耗很大的,所以场景中能整合的细小物体,使用相同材质和贴图的一定要合并成一个Mesh上面。接下来隔壁老王会推荐大家一款很实用的合并工具。
比如这个场景,就可以按照哪些物体都是用了相同的材质球和贴图,就可以选择性的合并在一起了。减少Unity的运算开销。
三、合并的Mesh要注意在场景中的布局,按区域划分,保证遮挡剔除能合理遮挡剔除。
加入我们一股脑的按照场景中的使用了相同贴图和材质的Mesh合并成一个大的Mesh,你到最后会发现,游戏的内存占用量又上来了,怎么去平衡这个问题呢,最终你的场景还是需要使用Unity的遮挡剔除功能,不在摄像机下渲染的Mesh给自动“卸载”掉,如果场景中就剩下一个大MESH,遮挡剔除的意义也就不存在了。所以我们需要按照小区域,合理的去合并需要合并的Mesh,最终去做一个平衡。
如下图:如果把房间给合并了,整个游戏房间的运行开销就会一直占用着内存,如果把房间分成几个小块,有了遮挡剔除就不会这样了,多存在创建几个材质球也是没关系的。
四、合并后的Mesh 一定不要存在场景里,一定要存在资源目录下
Unity商店里提供了许多实用的合并Mesh的工具,比如MeshBaker、这类工具会把生成的Mesh默认存在于Scene当中,这样就会导致我们的场景文件很大很大,该怎样解决这问题呢,我们就需要把合并的MESH数据(*.assets)文件存在资源目录里,在场景中存放的只是一个预设,引用资源,这样就极大的减少了单个场景的大小。
五、合并完的Mesh 一定要给第二套UV、保证Unity 可以对新生成的MESH 进行烘焙。
六、美术制作模型的时候尽量保证单个Mesh的UV 不要越界。
七、尽量少的用透明贴图的材质
推荐使用工具
https://www.assetstore.unity3d.com/en/#!/content/5017
八、如果可以的话可以使用LOD技术
所谓的LOD,说白了就是为了节省效率,突出效果,引擎里面做的一种讨巧的方法,远处的物体用一个低模渲染,近距离的模型用高模渲染。全名,Level of Deatail。
在引擎里怎么用,如图,很简单,创建一个空组,根据你的摄像机裁剪距离来拖拽你想要显示的物体,就可以了,剩下的交给引擎来处理。