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消耗和发布文件大小。记得物体的静态设置,物体的大小对遮挡很有影响。

时间: 2024-11-02 13:37:01

Occlusion Culling遮挡剔除理解设置和地形优化应用的相关文章

Unity4.3 遮挡剔除:基本知识

http://blogs.unity3d.com/2013/12/02/occlusion-culling-in-unity-4-3-the-basics/ 这篇博文由Umbra Software的Jasin Bushnaief所写,旨在解释Unity4.3遮挡剔除的更新. Unity4.3包含了大量的改进.全新的子系统之一包括遮挡剔除.不但简化了界面,剔除运行本身也改写了,还添加了一些列的新功能. 在这个系列的三篇博文里,我将介绍Unity4.3的新遮挡剔除系统的使用方法.第一篇讲完成遮挡剔除

Unity3D之InstantOC(遮挡剔除)

首先要先从网上下载InstantOC组件(网上资源很多的不用跟我要) 那么介绍一下这个组件是干什么用的,为什么要用它,有什么好处 在游戏中我们看到的物体,是如何呈现给我们的呢?如图: 渲染管线 CPU干得事情 第一步 游戏:其实就是CPU来判断视锥以内,所能看到的物体都需要渲染 第二步 图形API:它是要看你发布的平台,不一样平台所需要的图形API也就不一样,比如Windows平台就需要DX,手机端平台就需要OpenGL等.... 第三步:绘制调用Draw Call每次引擎准备数据并通知GPU的

[WebGL入门]十九,遮挡剔除和深度测试

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 多边形的外侧,内侧和遮挡剔除 上次介绍了索引缓存,以及使用IBO来绘图,使用索引缓存可以循环利用重复的顶点,能够提高绘图效率.这之后的文章,如果没有特殊的原因的话,基本上都会使用索引缓存,通过drawElements来绘图.这次来说一下遮挡剔除和深度测试,这是两个重要

Unity之一天一个技术点(四)---遮挡剔除

遮挡剔除 http://game.ceeger.com/Manual/OcclusionCulling.html 可以有效减少drawCall 摄像机看不到的地方会自动消失.只渲染摄像机能看到的对象. 这篇讲解的已经很清楚了,而且经测试无误. 在我显示90多drawCall的时候,使用遮挡剔除可以有效减少至80左右,还是有一定效果的~ 欢迎大家跟我交流学习~共同进步~

Hierarchical Z-Buffer Occlusion Culling

While I was at GDC I had the pleasure of attending the Rendering with Conviction talk by Stephen Hill, one of the topics was so cool that I thought it would be fun to try it out.  The hierarchical z-buffer solution presented at GDC borrows heavily fr

理解MySQL——索引与优化

转自:理解MySQL——索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多).如果对之建立B-Tr

理解MySQL——索引与优化(转)

理解MySQL--索引与优化 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多).如果对之建立B-Tree索

iOS图片设置圆角性能优化

问题 圆角虽好,但如果使用不当,它就是你的帧数杀手,特别当它出现在滚动列表的时候.下面来看圆角如何毁掉你的流畅度的. 实测 layer.cornerRadius 我创建了一个简单地UITableView视图,为每个cell添加了2个UIImageView实例,且为UIImageView实例进行如下设置 aImageView.layer.cornerRadius = aImageView.frame.size.width/2.0; aImageView.layer.masksToBounds = 

lucene之排序、设置权重、优化、分布式搜索(转)

lucene之排序.设置权重.优化.分布式搜索(转) 1. 基本应用 using System;using System.Collections.Generic;using System.Text;using Lucene.Net;using Lucene.Net.Analysis;using Lucene.Net.Analysis.Standard;using Lucene.Net.Documents;using Lucene.Net.Index;using Lucene.Net.QueryP