预计算可视性体积

概括叙述如何使用预计算可视性体积,通过离线剔除方法来动态剔除关卡中的对象。

Windows
MacOS
Linux

像其他剔除方法一样,预计算可视性体积 用于实现中小型场景的性能优化,通常用于因为硬件问题而使动态遮挡剔除受到限制的移动平台。预计算可视性体积根据玩家或摄像机的位置,将Actor位置的可视性状态存储在场景中。因此,预计算可视性对于主要为静态点亮的环境的项目、玩家运动受限和某些2D游戏区域最有用。

在照明构建期间,会在阴影投射几何体上方生成可视性单元格。Actor可视性从每个单元格位置存储。由于预计算可视性是在线下生成的,因此你省去的是通常用于硬件遮挡查询的渲染线程时间,但代价是会增加运行时内存和照明构建时间。基于这一点,建议仅在玩家或摄像机可访问区域放置体积来保持可视性剔除。 

示例场景视图

启用了预计算可视性可视化

设置和用法

首先,需要为关卡启用预计算可视性。方法是打开 世界场景设置(World Settings) 并找到 预计算可视性(Precomputed Visibility) 部分。找到后,启用 预计算可视性(Precomputed Visibility) 旁边的复选框。

WS_EnablePVIS.png

模式(Modes) 面板中,将 预计算可视性体积(Precomputed Visibility Volume) 拖到关卡并调节以适应可游戏区域。

请参阅下文的放置 以了解获得最佳效果的提示和建议。

PVIS_AddVolume.png

在预计算可视性发挥作用前,需要先 构建照明 并前往 显示(Show)>高级(Advanced)>预计算可视性(Precomputed Visibility) 使用关卡视口来启用预计算可视性单元格(蓝色框)。

当你放置体积时,请在玩家可访问区域放置,而不是单个全包含体积。这样,你就不会在运行时存储和加载永远不会用到的可视性数据。

照明构建前的预计算可视性可视化

照明构建后的预计算可视性可视化

如果你已经构建了照明,可以使用主工具栏中的 构建(Build) 下拉菜单,然后选择 预计算静态可视性(Precompute Static Visibility) 来生成可视性单元格,而不必每次重新构建照明。

Tip_buildJustPVIS.png

可视性单元格

在为关卡构建至少一次照明信息后,可以放置任意数量的预计算可视性体积,然后生成可视性单元格来填充任何静态阴影投射Actor的表面。你可以从主工具栏的"构建(Build)"下拉菜单选择 预计算静态可视性(Precompute Static Visibility) 选项来生成静态可视性。

预计算可视性单元格可视化:禁用

预计算可视性单元可视化:启用

使用 r.ShowRelevantPrecomputedVisibilityCells,以在启用了 显示预计算可视性单元格(Show Precomputed Visibility Cells) 的显示标志时,仅在摄像机附近显示可视性单元格。这有助于减少屏幕上一次性呈现的单元格数量。

就这个场景而言,已经放置了预计算可视性体积(绿色),构建了照明,并且墙壁和门遮挡了部分Actor。

下面,为了让你理解预计算可视性如何通过在单元格格中存储Actor位置,隐藏了部分墙壁和门。拖动滑块来移动摄像机位置,查看基于摄像机位置及其所在单元格的可视性状态变化。

示例图像中看不到预计算可视性单元格,这是为了更好地显示被遮挡的Actor的可视性状态。

生成预计算可视性后,单元格存储应该从这个单元格位置看到的Actor。在该示例中,由于单元格知道哪些可见哪些不可见,因此遮挡Actor(比如墙壁和门)可以隐藏,被遮挡Actor在摄像机位于预计算可视性单元格中时不可见,因此,这种剔除方法就是非常适用于部分游戏类型和平台的折中方法。

为Gameplay设置单元格游戏区域高度

在使用预计算可视性时需要记住的是,缩放与游戏有关,因此,可视性参数将需要针对每个游戏相应设置。

为此,需要更改 [虚幻引擎根目录]/Engine/Config 文件夹中的`BaseLightmass.ini`文件中的设置。找到 DevOptions.PrecomputedVisibility 部分。

[DevOptions.PrecomputedVisibility]
bVisualizePrecomputedVisibility=False
bCompressVisibilityData=True
bPlaceCellsOnOpaqueOnly=True
NumCellDistributionBuckets=800
CellRenderingBucketSize=5
NumCellRenderingBuckets=5
PlayAreaHeight=220
MeshBoundsScale=1.2
VisibilitySpreadingIterations=1
MinMeshSamples=14
MaxMeshSamples=40
NumCellSamples=24
NumImportanceSamples=40

在这些设置中,需要重点关注设置 PlayAreaHeight。该值表示可视性单元格位于表面上的高度(虚幻单位)。对于游戏,这应该是摄像机能够位于表面上的最高高度,通常是最高玩家的眼高加上跳跃高度。

在配置文件中设置 PlayAreaHeight 或任何其他设置不需要重新启动引擎。你可以编辑并保存.ini文件,然后使用主工具栏 构建(Build) 下拉菜单中的 预计算静态可视性(Precompute Static Visibility)

游戏区域高度:220(默认)

游戏区域高度:650

使用 第三人称(ThirdPerson) 模板,需要考虑几点因素来确定该游戏类型的PlayAreaHeight值应该为多少:

pvis_findingcameraheight.png

  1. 查找摄像机的最高旋转点。 1.摄像机可以绕着ThirdPerson模板中的角色360度旋转。最高点大约是距离地面 395 个单位。

  2. 玩家的跳跃高度。
    1.玩家可以跳到约 210 个单位的高度。

  3. 摄像机可以到达的最高高度。

    1.用最高摄像机位置(365个单位)加上玩家的跳跃高度(210个单位),摄像机可以到达的最高位置而不会超出单元格的高度就是 615 个单位。

知道PlayAreaHeight必须至少为615个单位才能保持摄像机位置(任意垂直旋转),就需要增加一点缓冲才能将摄像机保持在可视性单元格中。有缓冲的高度是 650 个单位。对于该游戏类型和摄像机运动,单元格达到这个高度是很合理的。但是,需要记住的是,PlayAreaHeight值越大,需要的运行时内存就越多,因为必须存储更多的Actor可视性状态。

使用预计算可视性覆盖体积

通过 预计算可视性覆盖体积,如果预计算可视性体积的自动生成结果不是你需要的结果,则可以手动覆盖Actor在场景位置中的可视性。这些也用于性能优化,只应放置在玩家能够访问的区域。

放置

要使用这个体积,从 模式(Modes) 面板中,将 预计算可视性覆盖体积(Precomputed Visibility Override Volume) 拖到关卡并调节以适应可游戏区域。

pvis_overridevolume_addtoscene.png

使用 加号+)按钮向数组列表添加任意数量的元素。 

pvis_overridesettings.png

对于添加的每个元素,使用拾取器或下拉选择菜单来添加Actor或关卡。

pvis_overridesettings_selectActor.png

有关更多信息,请参阅可视性和遮挡剔除设置

相关统计信息

在检查预计算可视性的性能时,首先需要查看 初始视图(Initviews)内存(Memory) 的一些统计信息。这两个统计信息面板用于告知你,预计算可视性的表现情况以及在进程中运行时使用的内存量。

Stat Initviews

使用命令 stat initviews 查看预计算可视性在关卡中的效率。

点击查看大图。

统计信息

描述

统计遮挡Primitive(Statically Occluded Primitives)

显示截头锥体剔除发生后,预计算可视性确定不可见的Primitive数量。仅当摄像机视图在可视性单元格内部时才可见。

遮挡Primitive(Occluded Primitives)

显示预计算可视性和动态遮挡系统确定不可见的Primitive数量。

解压遮挡(Decompress Occlusion)

显示解压预计算可视性所用的时间。大体积或较小单元格大小可以增大所用内存,从而影响解压所需的时间。

如果你看不到任何值,很可能是摄像机超出可视性单元格或没有生成预计算可视性。

StatInitviews2.png

如果"统计遮挡Primitive(Statically Occluded Primitives)"低于预期值,检查 世界场景设置(World Settings)>预计算可视性(Precomputed Visibility) 并查看 可视性加强(Visibility Aggressiveness)。设置强度越高,就会剔除越多Actor,但会引起更多可视性错误,例如角落突然跳出Actor。

Stat Memory

使用命令 stat memory 了解为游戏分配的内存使用,更具体地说,是了解预计算可视性。

点击查看大图。

统计信息 预计算可视性内存(Precomputed Visibility Memory) 显示当前用于预计算可视性的实际运行时内存使用。

StatMemory2.png

该统计信息在"在编辑器中运行(PIE)"模式下 可靠,因为会同时计算编辑器和PIE的内存用量。相反,仅使用"游戏视图中的编辑器"模式或"独立游戏"来获取最准确的结果。

限制

预计算可视性具有以下限制:

  • 不处理可移动Actor。

  • 不处理透光材质,如半透明或遮罩材质。

  • 单元格仅放置在表面上方。对启用飞行模式的项目益处不大。

  • 不能有效处理流送关卡。所有数据存储在持久关卡。

  • 只有静态阴影投射三角形会发生遮挡。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback