Unity优化场景的一点记录
Unity优化场景的一点记录
前言:
前段时间专业的工程实训,我选了《3D山地赛车》的游戏项目选题。和几个同学一起组队做。
《3D山地赛车》是一个支持单人模式(pve)、双人联机模式(pvp)的Android手机游戏。联机模式的话不是局域网联机,而是使用了广域网服务器的“真-联机”。
我是项目的程序。不仅写了Unity客户端代码,还把服务器端(nodejs)代码也给写了。完成了整个项目,自己很有成就感啊,233。
自己之后可能写一篇关于实现本项目中广域网“真-联机”的文章,如果不忙的话
因为时间有限,所以搭建第一关场景的任务交给了策划同学做。测试这一关时,玩起来非常卡。
(第一关开始画面-图)
frame debugger查看,发现竟然有5000多个drawcall,看到时吓了我一跳。怎么这么多?第一关除了玩家控制的赛车以外都是static物体,都会进入static batching方式处理。static batching处理时,Unity会把具有相同材质的静态物体给放在一个drawcall里。但是查看frame debug时具有相同材质的静态物体并没放到一个drawcall,却还是一个个绘制的。看到:
看了下这几个绘制的物体receive shadow都是勾选的,所以问题应该出在了within the shadow distance这里。就是这些物体受到了不同的阴影影响。比如2块石头,一块石头在树下,受到了树影子的影响,被放到一个drawcall里,另一块石头就是没有受到任何遮挡,所以直接被放在一个drawcall。它们就不能在一个drawcall里了。
找到原因了。这个场景里并不需要这些景物投射阴影,也不需要这些物体受阴影影响。那么我去掉就好了。
cast shadows 设为off,取消勾选receive shadows。同时我也并不需要让它影响lightmap,所以也取消勾选lightmap static好了。
hierarchy视图中输入关键字object,就出现关卡中的物体们。场景中物体命名也都比较有规律,所以可以多选,然后一起设置mesh renderer。不然我怕是要写个脚本来自动设置了。
就在我以为问题已经结束的时候,frame debug一看,发现还是有2000drawcall。这就比较费解了,既然很多物体已经无法投射shadow、也无法被shadow影响,那么不就应该问题解决了吗?
然后我hierarchy视图中浏览时看到light,想到会不会是场景里使用了一些灯光,影响了某些物体的阴影,让drawcall变多了呢?然后看了下,发现有16个点光源,而这些点光源都是16个大预制体的子物体。大预制体是策划同学为了方便,就把一大块区域做成预制体。。。
这几个点光源显然也是不需要的,整个关卡是比较明亮的,有environment light以及一个directional light就行了。我把这几个点光源删了。2000drawcall立刻减到了600 drawcall。
感觉还是比较多,就用一下“空间换时间”的办法吧。打开Window -> Occlusion Culling,调整下参数,bake一下。产生2MB大小的occlusion data,最终drawcall变为300 drawcall。而且这还是游戏开始,初始化场景时的drawcall,实际游戏开始之后drawcall会更少。
drawcall优化得差不多了,至此结束。
感想
让策划同学搭建关卡之前应该先跟他说一下一些规范,这样能够节省不少工作量。
一些链接:
UnityDrawcall Batching