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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值