unity 性能优化之遮挡剔除

一. 遮挡剔除简述

功能:遮挡剔除功能可以降低被渲染对象个数,从而降低每帧渲染时间。

原理:避免对因为完全被其他物体挡住而不可见的物体的渲染。

二. Unity遮挡剔除功能的使用方法简介

Unity也支持对动态物体的遮挡剔除。但是本文后面的部分只关注对于静态对象的遮挡剔除特性。

使用Unity的遮挡剔除功能大概需要做下面三件事情:

Step1:设置场景中哪些物体会遮挡其他物体(遮挡物occluder)

Step2:设置场景中那些物体需要做可见性查询,即确定哪些物体很可能被其他物体挡住(被遮挡物occludee)

Step3:烘培遮挡剔除数据,供游戏运行时使用。

编辑器中要进行相关操作前,需要开启Occlusion Culling窗口.

在这里插入图片描述

三. Unity遮挡剔除功能的使用方法详述

(1)设置对象为遮挡物or被遮挡物

选中某个对象后,在其Occlusion窗口可以设置其Occluder Static和Occludee Static属性:

  • 遮挡物

通过勾选一个对象的Occluder Static 可将其设置为静态遮挡物。理想的遮挡物应该是实心的,体积较大的物体。

原则1:可能阻挡到其它对象的对象才应该被设置为遮挡物。一些远景物体不要设置成遮挡物,否则很可能会导致剔除数据成倍增长以及运行时剔除查询效率降低。另外半透明的物体也不应设置为遮挡物。

原则2:对于某些带类似小孔的物体(例如网,树叶茂盛的树木),可以不将其设置为遮挡物,这样可以避免得到不正确的结果。(smallest
hole参数可以处理这种情况但是其值不宜设得太小)

  • 被遮挡物

通过勾选一个对象的Occludee Static(如上图)可将其设置为静态被遮挡物。

理想的被遮挡物应该是体积较小的,这样它被完全遮挡到的情况才会比较多,因此做遮挡剔除查询才比较有意义。但是如果将对象拆分得过小,也会导致遮挡剔除性能下降。

较大的物体不宜设成被遮挡物(例如在3dMax里合并了之后再倒入到Unity编辑器),但是请注意到被U3D做batch之后渲染的多个mesh在做遮挡剔除时还是会针对单个mesh分别进行,所以不受影响。

(2)烘培

在Occlusion窗口的Bake页面进行对场景的遮挡剔除数据的烘培。参见下图。

参数设置:

烘培参数的调整本质来说是剔除准确性和性能/效率的折中。在实践中,图3所示的三个参数值都应该从一个较大的值开始,不断调小,直到得到满意的结果。当你发现烘培时间过长或者烘培数据过大时,就应该尝试调大参数。
在这里插入图片描述

  • Smallest Hole

解释:如果场景中有带孔的物体需要能被视线穿透(例如墙上的洞, 房间的门),那么需要将Smallest Hole设置为小于孔的直径

原则:在不出现剔除错误(可见的物体被剔除了)的情况下,应该尽量将该值设大些。

建议值:0.05~0.50

  • Smallest Occluder

解释:顾名思义,就是场景内最小遮挡物的尺寸。设得过大会导致剔除成功率下降(但是应该不会产成剔除错误),过小会导致性能问题。

原则:设置为比Player高度略大的值。目前Player高度大概为1.8.

建议值:2~6

  • Backface threshold

解释:本参数的引入是为了减少剔除数据大小,另一方面,设置不当会导致剔除错误(可见的物体被剔除了)。因此,暂时请保持默认值100不变。

说明:工作机制是如果PVS产生的某个cell中观察到的阻挡面是backface的比例大于设定值,那么生成的剔除数据中将不会包含这个cell相关内容,从而降低了数据大小。如果运行时camera移动到该cell内,那么剔除查询结果将会是“Undefined”。
在这里插入图片描述
(3)遮挡剔除结果的验证

烘培进行完成后,可以在Bake页面最下方查看遮挡剔除数据大小,参见图7。遮挡剔除的结果可以在Scene窗口内实时查看。

具体方法如下:

  • 选中visualization页面,参见图8。

  • 选中场景内的某个摄像机,勾选它的Occlusion Cullling选项,参见图8。

  • 移动或旋转摄像机的位置,场景内的物体则会被实时剔除掉。需要注意的是,这是视锥剔除(frustum culling)和遮挡剔除共同作用的结果
    在这里插入图片描述
    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值