首先介绍下drawcall(这个东西越少你的游戏跑的越快):在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(drawcall),然后这个包传递到3D部分在屏幕上呈现出来。这就和你希望你的亲友收到准备好的圣诞礼物需要包装好然后穿过城市准时放在他应该出现的地方一样没什么不同。你的CPU来完成包装和传递他们的活,同时会消耗很多的带宽,所以最终分配好这些关键性资源很重要。目前,真正可怕的事情是从描绘指令消耗远景开始,每一个独立的飞溅到地板上的血迹和一个角色或者一具死尸消耗的字节是一样的多的:他们都消耗同样的描绘指令。除此之外,没有什么更多的差别。那么如何降低drawcall呢??那么我们就用到Culling(剔除)技术。如果不应用这个技术,电脑是不管3721把场景里所有的东西都送去渲染的。看得见的也渲染,看不见得照样也送去渲染。很傻是吧,那咋办呢。得告诉电脑,那个你看得见的渲染,看不见的就算了。于是就有了1.视锥体剔除(FrustumCulling)这个unity系统自带了好像,就不用操心了。2.遮挡剔除(OcclusionCulling)Unity3专业版内置了一个强大的OcclusionCulling插件Umbra免费的遮挡剔除(OcclusionCulling)遮挡剔除是一种什么样的特性呢,当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。.遮挡剔除在3D图形计算中并不是自动进行的。因为在绝大多数情况下离camera最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为重复渲染,无效渲染overdraw).遮挡剔除不同于视锥体剔除.视锥体剔除只是不渲染摄像机视角范围外的物体而对于被其他物体遮挡但依然在视角范围内的物体则不包括在内.注意当你使用遮挡剔除时你依然受益于视锥体剔除(FrustumCulling).左边的场景使用了遮挡剔除.右边的场景未使用遮挡剔除.遮挡剔除的运行将通过在场景中使用一个虚拟的摄像机来创建一个物体潜在可视性状态(set)的层级.这些数据可以让每个运行时间内的摄像机来确定什么能看见什么看不见。通过这些数据,Unity将确定只把可以看见的物体送去渲染.这将降低drawcalls的数量并提供游戏的运行效率.occlusionculling的数据由单元(cells)组成.每个单元是整个场景范围数值的一部分.更多特定的单元来自一个二叉树(binarytree).OcclusionCulling使用两个叉,一个给ViewCells(静态物体)另一个给TargetCells(移动物体).ViewCellsmap给出了一个定义了静态可视物体的索引列表(精确剔除后的静态物体).非常重要的一点是在创建你的物体时要随时注意,因为你需要在物体的尺寸和单元的尺寸间取得一个好的平衡.理想情况下,youshouldn'thavecellsthataretoosmallincomparisonwithyourobjectsbutequallyyoushouldn'thaveobjectsthatcovermanycells.有时你可以通过将大的物体拆成几个部分来改进遮挡剔除效果.无论如何你仍然能够将小的物体合并为一体来降低drawcalls,在它们都属于一些小的组件的时候,occlusionculling将不起作用.确定组件中那个是可视的组件的选集和可视信息被认为是PVS(潜在可视状态PotentiallyVisibleSet).OcclusionCulling设置为了使用遮挡剔除需要进行相关的手动设置.首先你关卡中的几何体必须被分割成明显的不同尺寸的块.这也有助于布置关卡中小块的容易定义的区域被其他大物体遮挡(例如墙,建筑物)这意味着每个单独的mesh被确定是否渲染取决于occlusion数据.所以如果你有一个物体包含了房间里的所有家具那么所有的家具要么全渲染,要么全不渲染.是否渲染是基于组件而不是基于每个单独物体自身的。在检视面板(Inspector)你需要标识(tag)所有需要应用遮挡剔除的场景物体。最快的方法是是将你需要标示为Static的物体作为一个EmptyGameObject的子物体并设置这个EmptyGameObject为Static,当option出现的时候选择affectchildren.当子物体被taggedasStatic你可以取消子物体和EmptyGameObject的父子关系.检视面板中的Staticcheckbox下一步点击Tools-OcclusionCulling.打开OcclusionCulling检视面板,在面板中你会发现几个数值被调整过了。这些数值前面描述过:-OcclusionCulling-Object遮挡剔除检视面板的object标签.Object标签可以让你创建OcclusionAreasGameObjects.这些区域让你指定什么地方你会使用遮挡剔除.注意:默认情况下如果你不创建任何遮挡剔除区域,整个场景都会进行遮挡剔除.PropertiesQuickSelect快速选择和创建一个OcclusionArea并且快速编辑它.None这个是默认值.CreateNew创建一个新的OcclusionAreaGameObject.当你点击CreateNewintheQuickSelectdropdown,Unity将自动创建一个OcclusionArea并且删除默认区域(整个场景).现在你可以根据需要开始调整OcclusionArea(s).OcclusionArea检视面板.PropertiesSize定义OcclusionArea的尺寸.Center选择OcclusionArea的中心.B默认为0,0,0并在box的中心位置.IsViewVolume定义摄像机的活动范围区域.点选这个选项才能应用遮挡剔除在OcclusionArea内的静态物体.IsTargetVolume如果你要遮挡剔除运动物体,打开这个选项.TargetResolution确定区域内的OcclusionCulling精度.即一个OcclusionArea的单元尺寸.注意:这个选项只对TargetAreas(移动物体)起作用.Low减少计算时间但同时精度降低.Medium计算时间和精度中等,比较平均.High计算时间长但精度高.VeryHigh精度很高,计算时间更长.ExtremelyHigh最高精度.注意:计算时间令人发指。如果摄像机处于遮挡区域之外或者任何物体超出区域,这些物体将不会被遮挡剔除.OcclusionCulling-BakeOcclusionculling检视面板baketab.PropertiesViewCellSize每个viewarea单元的尺寸,尺寸越小遮挡剔除越精确.这个数值用来平衡遮挡剔除的精度和存储容量NearClipPlaneNearclipplane如果设置最小数值那么游戏中所有摄像机都可看到.FarClipPlaneFarClipPlane用于选择objects.任何物体的距离大于这个设定数值都会被自动遮挡.(Shouldbesettothelargestfarclipplanedthatwillbeusedinthegameofallthecameras)Quality品质级别Preview开发阶段使用这个(ie,不是很准确但可以让你御览在游戏中的大致表现)Production如果开发基本结束准备发布那就该选择这个(会耗费更多的时间但更精确)当你调整完这些数值后可以点击Bake按钮开始处理OcclusionCulling数据.如果你对结果不太满意,你可以点击Clear按钮删除以前的计算数据.OcclusionCulling-VisualizationOcclusionculling检视面板visualization可视标签PropertiesQuickSelect让你快速选择场景中的任何摄像机来观看遮挡剔除的效果Thenearandfarplanes定义了一个虚拟摄像机来计算遮挡剔除数据.如果你有几个摄像机near或farplanes不同,你应该设置nearplane和largestfarplanedistance适配所有摄像机来调整物体的包括范围.所有场景里的物体只在数值范围内起作用所有请确定你的所有物体都处于可视范围.当你准备好生成occlusiondata,点击Bake按钮.记住在Bake标签的Qualityselectionbox中事先选择Preview和Production.Preview可以快速生成数据并可以快速检查结果.Production用于产品发布前的生成和检测.请记住遮挡剔除的数据计算生成速度取决于事先设置的celllevels(单元级别),数据尺寸大小和精度.Unity会在窗口底部显示PVS运算状态.运算处理结束后,你会在ViewArea看到一些不同颜色的cube.颜色相同的区域共享遮挡剔除数据.点击Clear如果你想删除所有遮挡剔除的事先计算好的数据(预计算数据).MovingObjects如果想应用遮挡剔除到一个运动物体你必须创建一个OcclusionArea然后设定其尺寸来适配运动物体的活动空间(注意:运动物体不能被标示为static).创建OcclusionArea后,检查IsTargetVolumecheckbox来遮挡剔除运动物体.移动物体的OcclusionAreapropertiesSize设定OcclusionArea尺寸.Center设定OcclusionArea的中心.默认0,0,0并位于box的中心.IsViewVolume定义摄像机能到哪里.检查这个数值来遮挡剔除OcclusionArea中的staticobjects.IsTargetVolume遮挡剔除运动物体时必选TargetResolution确定区域内的遮挡剔除精度。这将决定OcclusionArea的单元尺寸.注意:只对TargetAreas起作用.Low减少计算时间但同时精度降低.Medium计算时间和精度中等,比较平均.High计算时间长但精度高.VeryHigh精度很高,计算时间更长.ExtremelyHigh最高精度.注意:计算时间令人发指。添加完OcclusionArea后,你需要了解它是如何划分单元中的box.如果想了解occlusionarea如何计算运动物体,你必须在SceneView中点选Target按钮并且关闭View按钮同时OcclusionCulling检视面板是打开的.SelectingTarget(movingobjects)orView(staticobjects)让你御览calculateddata的运作.Testingthegeneratedocclusionocclusion设置完毕后,打开CullGeometryoption(intheOcclusionCullingwindow)并在场景视窗移动MainCamera.iSceneView中的OcclusionViewmode当你在周围移动MainCamera(无论是否在Playmode下),你将会看到不同的物体disable.你在这里需要找出的是occlusiondata中的任何错误.当你移动摄像机时你可能会发现会有物体突然出现在视野当中.如果这种情况发生,youroptionsforfixingtheerrorareeithertochangetheresolution(ifyouareplayingwithtargetvolumes),ortomoveobjectsaroundtocoveruptheerror.Todebugproblemswithocclusion,youcanmovetheMainCameratotheproblematicpositionforspot-checking.运算处理结束后,你会在ViewArea看到一些不同颜色的cube.蓝色cubes表现的是TargetVolu