开发VR游戏怎样优化大场景,分享几点技巧

发表于2016-05-17
评论0 1.7k浏览
    近几年,游戏品质越来越高,场景越来越丰富,表现越来越绚丽。国内的美术团队一直在这条路上慢慢成长。那么我们怎样做大场景呢?怎样优化大场景呢。不同平台有不同的方法,接下来隔壁老王就来分享一下他的方法。尤其是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。
  在引擎里怎么用,如图,很简单,创建一个空组,根据你的摄像机裁剪距离来拖拽你想要显示的物体,就可以了,剩下的交给引擎来处理。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引