首先介绍下draw call(这个东西越少你的游戏跑的越快):
在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏幕上呈现出来。这就和你希望你的亲友收到准备好的圣诞礼物需要包装好然后穿过城市准时放在他应该出现的地方一样没什么不同。你的CPU来完成包装和传递他们的活,同时会消耗很多的带宽,所以最终分配好这些关键性资源很重要。目前,真正可怕的事情是从描绘指令消耗远景开始,每一个独立的飞溅到地板上的血迹和一个角色或者一具死尸消耗的字节是一样的多的:他们都消耗同样的描绘指令。除此之外,没有什么更多的差别。
那么如何降低 draw call 呢??那么我们就用到Culling(剔除)技术。如果不应用这个技术,电脑是不管3721把场景里所有的东西都送去渲染的。看得见的也渲染,看不见得照样也送去渲染。很傻是吧,那咋办呢。得告诉电脑,那个你
看得见的渲染,看不见的就算了。于是就有了
1.视锥体剔除(Frustum Culling)这个unity系统自带了好像,就不用操心了。
2.遮挡剔除(Occlusion Culling)
Unity 3专业版内置了一个强大的 Occlusion Culling 插件 Umbra免费的
遮挡剔除(Occlusion Culling)
左边的场景使用了遮挡剔除. 右边的场景未使用遮挡剔除.
遮挡剔除的运行将通过在场景中使用一个虚拟的摄像机来创建一个物体潜在可视性状态(set)的层级. 这些数据可以让每个运行时间内的摄像机来确定什么能看见什么看不见。通过这些数据, Unity 将确定只把可以看见的物体送去渲染. 这将降低 draw calls 的数量并提供游戏的运行效率.
occlusion culling的数据由单元(cells)组成. 每个单元是整个场景范围数值的一部分. 更多特定的单元来自一个二叉树( binary tree). Occlusion Culling使用两个叉, 一个给 View Cells (静态物体) 另一个给 Target Cells (移动物体). View Cells map给出了一个定义了静态可视物体的索引列表 (精确剔除后的静态物体).
非常重要的一点是在创建你的物体时要随时注意,因为你需要在物体的尺寸和单元的尺寸间取得一个好的平衡. 理想情况下,you shouldn't have cells that are too small in comparison with your objects butequally you shouldn't have objects that cover many cells.有时你可以通过将大的物体拆成几个部分来改进遮挡剔除效果. 无论如何你仍然能够将小的物体合并为一体来降低draw calls, 在它们都属于一些小的组件的时候, occlusion culling 将不起作用.确定组件中那个是可视的组件的选集和可视信息被认为是 PVS (潜在可视状态PotentiallyVisible Set).
Occlusion Culling设置
为了使用遮挡剔除 需要进行相关的手动设置.首先 你关卡中的几何体必须被分割成明显的不同尺寸的块. 这也有助于布置关卡中小块的容易定义的区域 被其他大物体遮挡(例如墙,建筑物) 这意味着每个单独的mesh被确定是否渲染取决于occlusion 数据. 所以如果你有一个物体包含了房间里的所有家具那么所有的家具要么全渲染,要么全不渲染. 是否渲染是基于组件而不是基于每个单独物体自身的。
在检视面板(Inspector) 你需要标识(tag) 所有需要应用遮挡剔除的场景物体。最快的方法是是将你需要标示为 Static的物体作为一个 EmptyGameObject 的子物体并设置这个Empty GameObject 为Static,当option出现的时候选择affect children. 当子物体被tagged as Static你可以取消子物体和Empty GameObject的父子关系.
检视面板中的 Static checkbox
下一步点击Tools->Occlusion Culling. 打开 Occlusion Culling 检视面板,在面板中你会发现几个数值被调整过了。这些数值前面描述过:-
Occlusion Culling - Object
Object标签可以让你创建 OcclusionAreas GameObjects. 这些区域让你指定什么地方你会使用遮挡剔除.
注意: 默认情况下如果你不创建任何遮挡剔除区域, 整个场景都会进行遮挡剔除.
Properties
Quick Select
None
Create New
当你点击Create New in the Quick Select drop down, Unity将自动创建一个 Occlusion Area 并且删除默认区域(整个场景). 现在你可以根据需要开始调整OcclusionArea(s).
Occlusion Area 检视面板.
Properties
Size
Center
Is View Volume
Is Target Volume
Target Resolution
Low
Medium
High
Very High
Extremely High
如果摄像机处于遮挡区域之外或者任何物体超出区域,这些物体将不会被遮挡剔除.
Occlusion Culling - Bake
Properties
View Cell Size
Near Clip Plane
Far Clip Plane
Quality
Preview
Production
当你调整完这些数值后可以点击 Bake按钮开始处理OcclusionCulling 数据. 如果你对结果不太满意,你可以点击Clear 按钮删除以前的计算数据.
Occlusion Culling - Visualization
Occlusion culling 检视面板visualization 可视 标签
Properties
Quick Select
The near and far planes 定义了一个虚拟摄像机来计算遮挡剔除数据. 如果你有几个摄像机 near 或 farplanes不同, 你应该设置near plane 和largestfar plane distance适配所有摄像机来调整物体的包括范围.
所有场景里的物体只在数值范围内起作用所有请确定你的所有物体都处于可视范围.
当你准备好生成 occlusiondata, 点击 Bake 按钮. 记住在 Bake标签的Quality selection box 中事先选择 Preview 和 Production.
请记住遮挡剔除的数据计算生成速度取决于事先设置的cell levels(单元级别), 数据尺寸大小和精度. Unity会在窗口底部显示 PVS 运算状态.
运算处理结束后, 你会在View Area看到一些不同颜色的cube. 颜色相同的区域共享遮挡剔除数据.
点击Clear 如果你想删除所有遮挡剔除的事先计算好的数据(预计算数据).
Moving Objects
如果想应用遮挡剔除到一个运动物体你必须创建一个Occlusion Area然后设定其尺寸来适配运动物体的活动空间(注意:运动物体不能被标示为static).
创建 Occlusion Area后, 检查Is Target Volume checkbox 来遮挡剔除运动物体.
移动物体的Occlusion Area properties
Size
Center
Is View Volume
Is Target Volume
Target Resolution
Low
Medium
High
Very High
Extremely High
添加完Occlusion Area后, 你需要了解它是如何划分单元中的box. 如果想了解occlusionarea如何计算运动物体,你必须在Scene View中点选 Target按钮 并且 关闭 View 按钮同时Occlusion Culling 检视面板是打开的.
Selecting Target (moving objects) or View (static objects) 让你御览calculated data 的运作.
Testing the generated occlusion
occlusion 设置完毕后, 打开CullGeometry option (in the Occlusion Culling window) 并在场景视窗移动 Main Camera.
iScene View 中的OcclusionView mode
当你在周围移动Main Camera
运算处理结束后, 你会在View Area看到一些不同颜色的cube. 蓝色 cubes表现的是Target Volumes的单元划分.
如果occlusion完成后, 场景内任何物体也没有被遮挡, 拆分物体至更小的pieces 以便它们能被完整地包含在一个单元中.
要提醒朋友们的是,如果场景复杂,品质设置高的话,烘焙过程将漫长的令人发指。赶紧升级电脑吧!!!
对于没有买专业版并无法使用umbra插件的朋友也不必担心,还有另外一个Culling剔除插件可以选择,是完全免费共享的。具体名字忘记了,不过去unity网站的讨论版搜一下Culling关键词可以很容易找见。就到这里 .就到这里.转自: