Occlusion Culling遮挡剔除理解设置和地形优化应用
这里使用的是unity5.5版本
具体解释网上都有,就不多说了,这里主要说明怎么使用,以及参数设置和实际注意点
在大场景地形的优化上,但也不是随便烘焙就能降低帧率的,必须结合实际情况来考虑,当然还有透明物体问题和动态物体的剔除等等都将详细说明。
首先说一下烘焙的关系
因为unity摄像机自带视椎剔除(Frustum Culling),所以如果都是动态物体,那么只有视椎剔除,可以在bake过后通过camera的occlusion culling里面的visualize看出,其实不baked话也是有的,但是不能通过这样查看而已。
如果需要剔除动态物体,需要使用Occlusion Area,但是动态物体不是放进去烘焙了就能剔除的,这里能剔除动态物体是指存在静态遮挡物(occluder static)的情况下,可以把在Occlusion Area范围内运动被静态遮挡物遮挡的动态物体,如果没有静态遮挡物,进行还是简单的视椎剔除。
一个普通物体可以设置这里两个状态(地形不能),第一个occluder static是遮挡物,只会遮挡其他物体,而不会被遮挡,主要大物体这么设置,第二个occludee static是被遮挡物体,小型物体可以设置成这个,不明确或者大小适中的物体可以都勾选上,如果有透明物体等等特殊材质的那就都不勾,防止错误剔除。
Occlusion Area创建很简单,注意开始创建的时候是方的,不能旋转,最好用组件自带参数调节位置和范围,最好调节得正好包住动态物体运动的最大范围(就是不会超出去),Is View Volume是否剔除它内部的动态物体(最好勾上,除非你的动态物体剔除过多了影响投影视觉之类)
另外Occlusion Area包裹盒嵌套或者交错没有影响,但摄像机在这个区域内将进行遮挡剔除,在这个区域外只进行视椎剔除。所以如果是多个房间这种,最好一个个area之间是有些重叠交错的覆盖整个房间。
默认没有设置Occlusion Area是烘焙整个场景的,如果有些区域根本就没必要或者很少看到,那么用这个包住你需要的区域,可以减少烘焙时间,也能降低cpu占用。
这个也可以在地形上进行设置,可以从网格分布上看出,默认地形上如果没有Occlusion Area,那么这个地形密度差不多,如果地形中间有个Occlusion Area,那么周围就会很稀疏,而里面密度高。官方参考https://docs.unity3d.com/Manual/class-OcclusionArea.html
用scene或者visualization里面设置来可视化剔除区域
可以看到平时看不到的视椎剔除效果,点摄像机并且还要切换到visualize才能看到遮挡物剔除后的效果,参数可以自己试试,不多说了
注意力虽然地形可以使用这个优化,但不是能百分百的提高效率的,如果地形大山很多,而且物件很多,常常遮挡后面的效果,这个是可以提高效率的,如果是俯视视角,所有地形几乎可见,那么效率提升很少有时候设置反而降低,因为剔除是需要cpu参与的,所以这需要实际项目测试。注意了不同场景文件中同一个地形需要再次烘焙,因为地形一样不代表着地形上的其他东西一样嘛。
(没错这是一整块地形剔除后的效果)
下面是动态物体在Occlusion Area内的剔除测试
下面的灰色带洞墙没有设置成occluter static(场景物件和摄像机都在Occlusion Area内部)
可以看到只有边缘的视椎剔除
下面的灰色带洞墙设置成occluter static(场景物件和摄像机都在Occlusion Area内部)
可以看到洞里可以看到的地方也剔除了
然后说一下主要剔除参数设置面板
最上面按钮还原默认设置
Smallest Occluder越小越精确,但是会烘焙更慢,而且会消耗cpu,这个值最好不要比自己在场景里的最小物体小太多(这里的单位和世界单位一致,比如一个默认方块长为1),否则会浪费时间,但如果这个值大量就容易出现剔除错误,比如多剔除了可见的东西,而没剔除应该剔除的。如果不想消耗过多cpu,那就要更好地设置遮挡物体和被遮挡物体,不要两个都勾上。
Smallest Hole越小越精确,但是会烘焙更慢,是控制比如墙上的洞在多大的时候需要进行遮挡物剔除,如果数值太大,墙上的裂缝又比较小的情况下,就不会进行遮挡剔除,也就是说裂缝后即使看不到依然会被渲染。
backface threshold 用来优化剔除设置本身,这个值最好用默认100,就是不优化,因为如果你的场景物体大小差异很大,可能会剔除错误。这个主要是把背面的物体剔除,当然也不是想象的那么简单,他不可能把组合好模型背后的面剔除,也不是剔除一个物体背后的一个物体,那样功能不就重复了吗,它更像是把很里面或者很底下的物体剔除,如果这个值设置成最小的5,最多剔除的物体应该是物体里面的物体(摄像机在最外面的时候),或者是地形下面的物体,当然如果你有透明嵌套物体,最好还是把这个改成100。
还有一个相关的组件Occlusion Portal 遮蔽通道
这个可以通过在运行状态切换是否可以通过,即是否遮蔽,这种剔除准确,但是耗cpu
具体没怎么试过
文件
在工程里会出现OcclusionCullingData文件,然后会增加Library目录的大小,其实你进去就会发现烘焙的结果都是放在Library里的Occlusion文件夹的。
OcclusionCullingData解释如下
PVS (Potentially Visible Set)潜在可见集,打开会unity会卡住爆表的,看了也没啥用
Scenes不同场景的烘焙结果,一个场景里有两个场景就会是2
Static renderers静态物体
Portals通道数量就是上面说的遮蔽通道
代码控制方面
void OnBecameVisible()
void OnBecameInvisible()
Renderer.isVisible
具体可以参考这里
http://blog.csdn.net/cartzhang/article/details/52684127
关于剔除影响不影响事件问题
https://forum.unity3d.com/threads/is-culling-killing-performance.183679/
最后总结
摄像机要在Occlusion Area内才能遮挡物剔除(当然不创建Occlusion Area的话默认整个场景),否则只有自带的视椎剔除,另外地形烘焙会略微增加运行时cpu消耗和发布文件大小。记得物体的静态设置,物体的大小对遮挡很有影响。
Occlusion Culling遮挡剔除理解设置和地形优化应用的更多相关文章
- Unity Occlusion Culling 遮挡剔除研究
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52684127 作者:car ...
- 遮挡剔除 Occlusion Culling(转)
一.首先介绍下draw call(这个东西越少你的游戏跑的越快): 在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏 ...
- Unity3D-游戏场景优化之遮挡剔除(Occlusion Culling)的使用
在大型3D游戏场景中,如何优化游戏性能是非常重要的一步.一般遮挡剔除是非常常用的.接下来我们看看如何使用遮挡剔除. 假设这是一个游戏场景. 下面这是相机的视口,相机的视觉是看不到很大立方体后面的那些小 ...
- Unity4.3 遮挡剔除:基本知识
http://blogs.unity3d.com/2013/12/02/occlusion-culling-in-unity-4-3-the-basics/ 这篇博文由Umbra Software的J ...
- [WebGL入门]十九,遮挡剔除和深度測试
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外.鄙人webgl研究还不够深入,一些专业词语,假设翻译有误.欢迎大家指 ...
- unity 的视锥剔除和遮挡剔除
Regular frustum culling only renders objects within the camera’s view. This is automatic and always ...
- Unity性能优化-遮挡剔除
1. Occlusion Culling-遮挡剔除的含义:没有在Camear视野范围内的游戏物体不进行渲染Render(默认情况下,Unity是会渲染所有GameObject,无论Camear是否看得 ...
- Occlusion Culling
遮挡剔除 http://www.bjbkws.com/online/1092/ unity遮挡剔除(应用) http://www.unitymanual.com/thread-37302-1-1.ht ...
- Hierarchical Z-Buffer Occlusion Culling
While I was at GDC I had the pleasure of attending the Rendering with Conviction talk by Stephen Hil ...
随机推荐
- jdk678910新特性地址
jdk678910新特性地址 https://blog.csdn.net/f641385712/article/details/81289401 每篇一句:每个人受到的尊重从来都不是应得的,而是赢得的 ...
- Redis五种数据类型-设置key的过期时间
1.redis命令客户端 [root@localhost bin]# ./redis-cli 127.0.0.1:6379> #是否运行着 127.0.0.1:6379> ping PON ...
- CF 554B 找相同行
给定一个由n*n块地砖铺成的房间,每块砖用0表示未打扫,1表示已打扫. 要求打扫时只能整列地扫,未打扫的会变为已打扫,已打扫的会变为未打扫.即1会变成0,而0会变成1,目标是 使最后整行为1的行数最大 ...
- 008 使用POJO对象绑定请求参数
1.介绍 2.Person.java package com.spring.bean; public class Person { private String username; private S ...
- IO知识点整理(序列化,管道流,数据流,字节数组流,与编码)
一:序列化的问题 1.序列号的使用问题 关于在序列化中的序列号的使用问题,一般要是使用. 因为,每次要序列化的类产生都会产生一个一个新的序列号,如果将这个类的程序修改后,就会产生新的序列号,以前序列化 ...
- MIT-6.828-JOS-lab4:Preemptive Multitasking
Lab 4: Preemptive Multitasking tags: mit-6.828, os 概述 本文是lab4的实验报告,主要围绕进程相关概念进行介绍.主要将四个知识点: 开启多处理器.现 ...
- EntityFramework笔记
参照文档:http://www.cnblogs.com/farb/p/ABPAdvancedTheoryContent.html 案例:http://pan.baidu.com/s/1c1Qgg28 ...
- Android-语言国际化
Android-语言国际化 参考 http://www.loc.gov/standards/iso639-2/php/code_list.php 各国语言表 Overview Internationa ...
- Codeforces.835E.The penguin's game(交互 按位统计 二分)
题目链接 \(Description\) 有一个长为\(n\)的序列,其中有两个元素为\(y\),其余全为\(x\).你可以进行\(19\)次询问,每次询问你给出一个下标集合,交互库会返回这些元素的异 ...
- 使用Newlife网络库管道模式解决数据粘包(二)
上一篇我们讲了 如何创建一个基本的Newlife网络服务端 这边我们来讲一下如何解决粘包的问题 在上一篇总我们注册了Newlife的管道处理器 ,我们来看看他是如何实现粘包处理的 svr.Add< ...