obsidian/笔记文件/2.笔记/Unity性能优化_第十章.md
2025-03-26 00:02:56 +08:00

6.2 KiB
Raw Permalink Blame History

Unity遮挡剔除、Occlusion Culling窗口、Occluder Static、Occludee Static、Occlusion Culling窗口、Occlusion Area组件、Occlusion Portal组件

正常情况下如果一个障碍物A挡住了后面的物体B虽然我们看不见物体B但是Unity仍然会消耗性能来渲染这个物体B。这样CPU和GPU就会有一部分性能白白浪费在渲染物体B身上。

如果想在一个障碍物挡住了后面的物体后,不渲染被挡住的物体,则可以使用遮挡剔除。

官方文档:https://docs.unity3d.com/cn/current/Manual/OcclusionCulling.html

以一堵墙挡住几个小球为例选中这堵墙在Inspector窗口右上角的Static右侧的下拉菜单处选择Occluder Static则这堵墙就是遮挡物。分别选中这些小球在Inspector窗口右上角的Static右侧的下拉菜单处选择Occludee Static则这些小球就是被遮挡物。

注意无论是勾选了Occluder Static还是Occludee Static勾选后物体就无法运动了。

对于一个物体,两个标签都可以勾选,这样它既可以遮挡剔除别的物体,也可以被别的物体遮挡剔除。

有时候被遮挡物只勾Occludee Static烘焙之后可能看不出遮挡剔除的效果建议把Occluder Static也勾上再重新烘焙或许就能看出效果了。

选中摄像机要确保它启用了Occlusion Culling属性。

设置完之后,要创建一个遮挡区域,当摄像机处于这个遮挡区域中,遮挡剔除才会生效。

创建遮挡区域的方法: 方法1、打开Occlusion Culling窗口。打开方法Window——Rendering——Occlusion Culling——Bake。打开之后选择Object选项卡点击Occlusion Areas点击Create New右侧的Occlusion Area。 方法2、创建一个空物体在它身上添加Occlusion Area组件。

Occlusion Area组件的Size决定了遮挡剔除区域的范围它越大烘焙之后生成的遮挡剔除区域就越大。Center控制遮挡区域中心点的世界坐标。Is View Volume表示是否定义视图体积只有启用了这个选项Occlusion Area组件才可能生效。

之后要让遮挡剔除生效还要在Occlusion Culling窗口的Bake选项卡中点击右下方的Bake按钮进行烘焙遮挡剔除才可能生效。而且以后每次调整完场景的遮挡物、被遮挡物、Occlusion Area组件的范围都要这样烘焙一次。如果点击旁边的Clear按钮则会清除之前烘焙的数据。

    烘焙完之后当摄像机在Occlusion Area组件的范围内则被遮挡的物体不会被渲染。遮挡物实际上遮挡了摄像机视锥体的范围只要物体完全没有出现在摄像机视锥体的范围内则都不会被渲染。但是一旦物体的任意一小部分暴露在了摄像机视锥体的范围内则这个物体整个会被渲染出来
    当摄像机移出了Occlusion Area组件的范围则遮挡剔除会失效。

Occlusion Culling窗口 Object选项卡。分别点击All、Renderers、Occlusion Areas按钮可以筛选Hierarchy窗口的内容。之后在Hierarchy窗口或Scene窗口中选择一个筛选出来的游戏对象就可以Occlusion Culling窗口中查看它的遮挡剔除设置。 Bake选项卡。用于烘焙。遮挡剔除必须烘焙之后才可能生效。Set default parameters用于将参数重置为默认值。Smallest Occluder表示用于遮挡其它游戏对象的最小游戏对象的大小以米为单位数值越小遮挡的效果越精确但是性能开销也越大。Smallest Hole表示摄像机可以看到的最小间隙的直径以米为单位需要注意的是设置过小的Smallest Hole值可能会导致一些细微的间隙被错误地认为是可见的从而导致部分遮挡物不被正确地剔除。Backface Threshold的数值越小烘焙所产生的文件所占空间就越小但也可能造成视觉上的失真。Bake按钮用于烘焙。Clear按钮用于清除上一次烘焙的数据。 Visualization选项卡。选择后可以在Scene窗口看到遮挡剔除的效果。此时在Scene窗口可以看到三个选项。 ①Camera Volumes。启用后可以在Scene窗口看到黄色区域当摄像机在这个黄色区域内遮挡剔除才可能会生效摄像机离开这个区域则遮挡剔除就会失效。我们还可以看到灰线这些灰线指示摄像机当前位置所对应的遮挡剔除数据中的单元格以及当前单元格中的细分。Bake选项卡Smallest Hole参数设置定义了单元格内细分的最小大小它的值越小每个单元格产生的细分越多且越小从而使精度提高并且文件增大。 ②Visibility Lines。启用后我们会看到绿色的区域它表示摄像机可以看到的范围。 ③Portals。启用后我们可以看到一些线它们代表遮挡数据中单元格之间的连接。

进行遮挡剔除的烘焙时不会烘焙动态的游戏对象的信息到遮挡剔除的数据中。动态的游戏对象只能作为被遮挡物而不能充当遮挡物。要让动态的游戏对象成为遮挡剔除中的被遮挡物可以选中它启用它身上Mesh Renderer组件身上的Dynamic Occlusion属性。

    使用Occlusion Portal组件也可以实现遮挡剔除。
    例如可以在一堵墙上添加Occlusion Portal组件。而且这堵墙不要不勾选Inspector窗口右上角下拉菜单的Occluder Static和Occludee Static但是被它遮挡的物体仍然要勾选Occluder Static和Occludee Static。
    设置好之后打开Occlusion Culling窗口在Bake选项卡进行烘焙。
    这样一来Occlusion Portal组件就会生效。当取消勾选它的Open属性后被这堵墙就会使用遮挡剔除。当勾选它的Open属性后被这堵墙就不会使用遮挡剔除。我们可以使用代码来控制Open属性控制这堵墙在什么时候使用遮挡剔除什么时候不使用遮挡剔除。
    Occlusion Portal组件的Center属性控制了中心的位置Size属性控制了遮挡的范围。点击Edit Bounds左侧的按钮后可以在Scene窗口手动调节Occlusion Portal组件的遮挡范围。每次调整完或者修改过场景都要重新烘焙。