一、首先介绍下draw call(这个东西越少你的游戏跑的越快):
在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏幕上呈现出来。这就和你希望你的亲友收到准备好的圣诞礼物需要包装好然后穿过城市准时放在他应该出现的地方一样没什么不同。你的CPU来完成包装和传递他们的活,同时会消耗很多的带宽,所以最终分配好这些关键性资源很重要。目前,真正可怕的事情是从描绘指令消耗远景开始,每一个独立的飞溅到地板上的血迹和一个角色或者一具死尸消耗的字节是一样的多的:他们都消耗同样的描绘指令。除此之外,没有什么更多的差别。
那么如何降低 draw call 呢??那么我们就用到Culling['kʌlɪŋ] (剔除v. 挑选,剔除( cull的现在分词 ))技术。如果不应用这个技术,电脑是不管3721把场景里所有的东西都送去渲染的。看得见的也渲染,看不见得照样也送去渲染。很傻是吧,那咋办呢。得告诉电脑,那个你
看得见的渲染,看不见的就算了。于是就有了
1.视锥体剔除(Frustum Culling)这个unity系统自带了好像,就不用操心了。 ['frʌstəm]
2.遮挡剔除(Occlusion Culling) [ə'klu:ʒn] n. 闭塞,锢囚锋;咬合;堵塞
Unity 3专业版内置了一个强大的 Occlusion Culling 插件 Umbra ([ˈʌmbrə]n. 本影,暗影,蚀时的地球) 免费的
遮挡剔除(Occlusion Culling) 遮挡剔除是一种什么样的特性呢, 当一个物体被其他物体遮挡住而不在摄像机的可视范围内时不对其进行渲染。. 遮挡剔除在3D图形计算中并不是自动进行的。因为在绝大多数情况下离 camera 最远的物体首先被渲染,靠近摄像机的物体后渲染并覆盖先前渲染的物体(这被称为重复渲染,无效渲染"overdraw"). 遮挡剔除不同于视锥体剔除. 视锥体剔除只是不渲染摄像机视角范围外的物体而对于被其他物体遮挡但依然在视角范围内的物体则不包括在内. 注意当你使用遮挡剔除时你依然受益于视锥体剔除(Frustum 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 but equally you shouldn't have objects that cover many cells.有时你可以通过将大的物体拆成几个部分来改进遮挡剔除效果. 无论如何你仍然能够将小的物体合并为一体来降低draw calls, 在它们都属于一些小的组件的时候, occlusion culling 将不起作用.确定组件中那个是可视的组件的选集和可视信息被认为是 PVS (潜在可视状态Potentially Visible Set). [pə'tenʃəlɪ]adv. 潜在地;可能地;<古>强有力地;权威地
二、Occlusion Culling设置
为了使用遮挡剔除 需要进行相关的手动设置。首先,你关卡中的几何体必须被分割成合理大小的块。这也有助于布置关卡中小块的,明确界定的区域 被其他大物体遮挡(例如墙,建筑物)。这意味着每个单独的网格根据遮挡数据确定是否渲染。所以如果你有一个物体包含了房间里的所有家具,那么所有的家具要么全渲染,要么全不渲染。 使每个家具都有自己的网格,这会有不一样的感觉,那么可以根据摄像机的视点,各个物体可以单独地被剔除。
在检视面板(Inspector) 你需要标识(tag) 所有需要应用遮挡剔除的场景物体。最快的方法是选择多个想要遮挡计算的物体,然后标记它们为Occlusion Static 和 Occludee Static。
应该在什么时候使用Occludee Static?透明物体不能遮挡,以及小物件,都不可能阻挡其他的东西,应标记为Occludees,但不遮挡。这意味着它们将被视为能被其他物体遮挡,但不会被视为作为遮挡物自身,这将有助于减少计算量。
Occlusion Culling Window 遮挡剔除窗口
对于大多数涉及遮挡剔除的操作,我们建议您使用遮挡剔除窗口(Window->Occlusion Culling)
在遮挡剔除窗口,您可以使用遮挡物网格和遮挡区域。
如果你是在遮挡剔除窗口的Object标签并在场景有一些Mesh Renderer被选择,你可以修改相关静态标识:
注意:默认如果你没有创建遮挡区域,遮挡剔除将应用到整个场景。
注意:每当相机在遮挡区域之外,遮挡剔除将不应用。重要的是这种遮挡区域覆盖的地方要有相机,但做遮挡区域太大,会导致烘焙更多开销。
Occlusion Culling - Bake 遮挡剔除 - 烘焙
Properties 属性
-
Technique技术Select between the types of occlusion culling baking
选择遮挡剔除烘焙的类型 -
PVS only
仅PVSOnly static objects will be occlusion culled. Dynamic objects will be culled based on the view frustrum only. this technique has the smallest overhead on the CPU, but since dynamic objects are not culled, it is only recommended for games with few moving objects and characters. Since all visibility is precomputed, you cannot open or close portals at runtime.
只有静态的物体会遮挡剔除。动态物体只根据视图视锥体被剔除。该技术具有最小的CPU的开销,推荐在很少移动物体和人物的游戏上使用。因为所有的可见性是预先计算的,您不能实时打开或关闭入口。 -
PVS and dynamic objects
PVS和动态物体Static objects are culled using precomputed visibility. Dynamic objects are culled using portal culling. this technique is a good balance between runtime overhead and culling efficiency. Since all visibility is precomputed, you cannot open or close a portal at runtime
静态对象使用预先计算可见性进行剔除。动态对象使用portal剔除。该技术是实时开销和剔除效率之间很好的平衡。因为所有的可见性是预先计算的,您不能实时打开或关闭入口。 -
Automatic Portal Generation
自动生成入口Portals are generated automatically. Static and dynamic objects are culled through portals. This allows you to open and close portals at runtime. This technique will cull objects most accurately, but also has the most performance overhead on the CPU.
入口自动生成。静态和动态物体通过入口剔除。这允许你实时打开和关闭入口。这种技术剔除物体最准确,但CPU的性能开销最大。 -
View Cell Size
视图单元格大小Size of each view area cell. A smaller value produces more accurate occlusion culling. The value is a tradeoff between occlusion accuracy and storage size
每个视图区域单元格的大小, 大小越小遮挡剔除越精确. 该值是遮挡的准确性和存储大小之间的权衡。 -
Near Clip Plane
近裁剪平面Near clip plane should be set to the smallest near clip plane that will be used in the game of all the cameras.
近裁剪面应该设置最小数值 那么游戏中所有摄像机都可用。 -
Far Clip Plane
远裁剪平面Far Clip Plane used to cull the objects. Any object whose distance is greater than this value will be occluded automatically.(Should be set to the largest far clip planed that will be used in the game of all the cameras)
远裁剪面用于剔除物体. 任何物体的距离大于这个设定值都会被自动遮挡.(远裁剪面应该设置为最大的值,可以被游戏里所有的摄像机使用) -
Memory limit
内存限制This is a hint for the PVS-based baking, not available in Automatic Portal Generation mode
这是一个基于PVS烘焙的提示,Automatic Portal Generation 模式下不可用。
当您调整这些值后,您可以点击烘焙Bake 按钮开始处理遮挡剔除数据。如果你不是很满意得到的结果,您可以点击"清除Clear "按钮来删除先前计算的数据
Occlusion Culling - Visualization 遮挡剔除 - 可视化
1、近平面和远平面定义了一个虚拟摄像机来计算遮挡剔除数据。如果你有近平面或者远平面不同的几个摄像机, 你应该把近平面设置为所有摄像机中最小的值和远平面设置为所有摄像机中最大的值,来正确调整物体的包括范围。
2、场景里的所有物体影响包围体积的大小,请让你的所有物体保持在场景可视范围内。
3、当你准备好生成遮挡数据, 点击 Bake (烘焙)按钮, 记得选择烘焙(Bake )选项卡的内存限制(Memory Limit )。越小的值,生成越快,精确性越小。较高的值,产品质量更接近发布。
4、请记住遮挡剔除的数据计算生成速度取决于你设置的cell levels(单元级别), 数据大小大小和质量品质. Unity会在主窗口底部显示 PVS 生成状态.
5、运算处理结束后, 你会在视图区域看到一些彩色的立方体. 彩色区域是共享遮挡剔除数据的区域.
6、如果你想删除所有遮挡剔除的事先计算好的数据(预计算数据),点击Clear 按钮.
Occlusion Area 遮挡区域
如果想在运动物体应用遮挡剔除,你必须创建一个Occlusion Area(遮挡区域)然后修改其大小来适应运动物体的活动空间(注意:运动物体不能被标示为静态). 您可以创建遮挡区域,把遮挡区域组件添加到一个空的游戏物体(菜单Component->Rendering->Occlusion Area )创建遮挡区域( Occlusion Area)后, Is Target Volume 复选框打勾, 来遮挡剔除运动物体。
移动物体的遮挡区域属性
-
Size 大小Defines the size of the Occlusion Area.定义遮挡区域大小
-
Center中心Sets the center of the Occlusion Area. By default this is 0,0,0 and is located in the center of the box.
设定遮挡区域的中心。默认0,0,0 并位于盒子的中心 -
Is View Volume是否视图体Defines where the camera can be. Check this in order to occlude static objects that are inside this Occlusion Area.
定义摄像机能到哪里。选中这个选项,来遮挡遮挡区域内的静态物体 -
Is Target Volume是否目标体Select this when you want to occlude moving objects.
当你想遮挡剔除运动物体时选上。 -
Target Resolution目标分辨率Determines how accurate the occlusion culling inside the area will be. This affects the size of the cells in an Occlusion Area. NOTE: This only affects Target Areas.
确定区域内的遮挡剔除的精度。这影响遮挡区域的单元格大小。注意: 这个选项只对 Target Areas(移动物体)起作用 -
Low低This takes less time to calculate but is less accurate.
这花费较少的时间来计算,但是不够准确。 -
Medium中This gives a balance between accuracy and time taken to process the occlusion culling data.
平衡准确性和花费时间处理遮挡剔除数据。 -
High高This takes longer to calculate but has better accuracy.
计算时间长但精度高 -
Very High非常高Use this value when you want to have more accuracy than high resolutions, be aware it takes more time.
当你想要比高分辨率(high resolutions)更高的精度,使用这个值。注意这会花费更多时间。 -
Extremely High极高Use this value when you want to have almost exact occlusion culling on your moveable objects. Note: This setting takes a lot of time to calculate.
使用这个值,当你想在可移动的物体上得到几乎确切的遮挡剔除。 注意:这个设定需要大量的时间来计算。
添加完遮挡区域后, 你需要了解盒子是如何划分成单元格。要查看遮挡区域如何被计算,在遮挡剔除预览面板,选择"编辑Edit "和勾上"视图View "按钮。
遮挡设置完毕后, 启用遮挡剔除(在遮挡剔除预览面板Occlusion Culling Preview Panel,可视化模式) 并在场景视窗移动主摄像机Main Camera进行测试。
当你在左右移动主相机 (无论是否在播放模式下), 你将会看到各种物体禁用自己,你在这里需要找出的是遮挡数据中的任何错误。当你移动摄像机时你可能会发现会有物体突然出现在视野当中,如果这种情况发生, 通过修改分辨率来修复错误(如果是在target volumes模式播放)或左右移动物体左右掩饰错误。要调试遮挡的问题,你可以移动主相机来检查问题的位置。
运算处理结束后,你会在View Area看到一些不同颜色的cube, 蓝色 cubes表示的是Target Volumes 的单元划分, 白色 cubes表示的是 View Volumes的单元划分,如果参数设置正确你会看到一些物体不被渲染,这表示要么这些物体不在摄像机视角范围内要么被其他物体遮挡住了。
如果遮挡完成后,场景内任何物体也没有被遮挡,拆分物体至更小的块,以便它们能被完整地包含在一个单元格中。
Occlusion Portals 遮挡入口
为了创造实时可开启和可关闭的遮挡,Unity使用遮挡入口(Occlusion Portals)。
-
Open打开Indicates if the portal is open (scriptable)
表示入口是否打开(可编写脚本) -
Center中心Sets the center of the Occlusion Area. By default this is 0,0,0 and is located in the center of the box.
设定遮挡区域的中心. 默认0,0,0 并位于盒子的中心。 -
Size大小Defines the size of the Occlusion Area.
定义遮挡区域大小
from:Unity盛典 http://game.ceeger.com/Manual/OcclusionCulling.html