Hint 固体
Hint 平面用于在编译时拆分可见性分支区域 ,因此是优化 Vis 地图编译阶段结果的一种方式。
它们通常被称为 Hint 固体 ,因为它们以与普通世界固体相同的方式放置在地图中。Hint 平面由覆盖有 tools/toolshint
纹理的固体的一个边定义。可以通过为固体的多个边添加纹理或使用多个固体来定义多个 Hint 平面。固体的其他不充当 Hint 平面的一侧必须用 tools/toolsskip
覆盖;编译器将忽略这些面。
Hint 会自动绑定到其自己的自动可见组,因此你可以轻松隐藏它们。
为什么以及什么时候切分可见性分支区域
有时,某些叶子(即“可见性分支区域”)形状比其他形状更受欢迎,仅仅是因为这种形状使这些叶子看到更少的其他叶子。每当看不到叶子时,就不会绘制叶子的内容,从而加快渲染速度。
下面说明了叶片切割的重要性,同时提供了提示有用的示例。
第一个示例与 SDK 示例地图几乎相同。这是一个单人房间的侧视图,玩家和管道被一堵墙隔开:
当玩家处于两个 player_start 中的任何一个时,引擎必须考虑是否应该绘制墙壁右侧的固体(管道)。发生这种情况是因为 vbsp.exe
没有采取最有效的方式将我们的关卡划分叶子:
因为叶子很高,一直到天花板,所以左边的叶子(和玩家一起)可以用管道直接“看到”右边的叶子。因此,引擎将绘制叶子和内容物(管道)。很遗憾,因为从玩家的角度看不到这些管道(它们在中间的墙后面)。我们可以使用 Hint 来引导叶子制作过程。
白线是带有工具 tools/toolshint
纹理的画笔的一面。它迫使 vbsp
将我们的地图分成三片叶子。在这种情况下,不能再有一条从玩家所在的叶子到管道所在的叶子的直线。这就是 Hint 的本质。
天空盒 有时有点高,导致玩家在城市中看到很多东西,因为他们所在的叶子可以看到房屋(如上例所示)。这也是一个很好的情况,我们可以使用 Hint 来阻挡可见性。
角落 Hint
这是一个典型角落的俯视图。有两个玩家(绿色盒子),两端的圆柱代表了很多引擎要绘制的东西。在这种情况下,Hint 的目标是避免在不必要的情况下渲染对象,例如,当玩家在远离对象的拐角处时。
有人可能会认为 vbsp
会确保每个玩家不会看到属于另一个玩家的对象。这是错误的。它将这个空间分成两片叶子,沿着棕色或粉红色的线切割叶子(取决于 vbsp
首先切割哪个固体面)。
无论哪种方式,两个角落的叶子彼此直接可见,因此当站在相对的角落时,每个角落的内容将始终渲染。
只需在角落放置一个 Hint,将我们的关卡分成三片叶子(总共三片而不是两片),但要确保一个玩家的东西不会从另一个玩家的角度渲染,就可以大大改善这种情况。
红色和棕色叶子之间没有直接的视线,因此避免了不必要的渲染。但是,如果其中一个玩家进入绿色的叶子,他们将看到自己和另一个玩家的东西都被渲染。你无法用 Hint 来阻止这种情况。阻止这种情况的唯一方法是更改关卡布局或使用其他方法,如控制几何可见性和编译时间 中所述的方法。
更多示例
以下是何时以及如何使用 Hint 的几个示例。在所有情况下,目标都是将绿色玩家彼此隐藏起来。上面的三个工作正常。左边的那个说明,即使它的一个 Hint 固体跨越角落也无关紧要,只要它的角度 > 180°,两个玩家就不会“看到”对方的叶子,因为他们的叶子之间没有一条直线连接。左下角的示例显示了当角度小于 180° 时可能会发生何种情况。我们可以很容易地从叶子到叶子画一条直线,导致非功能性 Hint(Hint 没有达到它的效果)。
当走廊的拐角是 180° 时,如中间顶部图片所示,两个 Hint 就足够了。事实上,他们甚至可以更接近玩家,但这会降低他们的效率(更多的东西将在“拐角处”绘制。在中间底部的示例中,Hint 的高度已降低,vbsp 被迫切割顶部的 visleaf,因为 visleaf 不能是凹形 。无论 vbsp 如何切割这个角落,Hint 总是会降低工作效率并创建额外的叶子(vvis 的更多计算)。在示例中,左侧玩家可以看到叶子 1 和 2(与上面的面相同),但右侧玩家将看到所有三个编号的叶子(这比顶部示例更多)。
右边的两张图片告诉你,你应该让事情尽可能简单。如果一个 Hint 就足够了,如上例所示,则首选。而且,显然,如果不需要,则不应使用 Hint,如下图所示。如图所示,vbsp 无法创建使两个玩家都能看到对方的叶子,因此这里不需要使用 Hint 来隐藏玩家(当然,可以使用 Hint 来隐藏走廊的某些部分)。在同一示例中,中间墙永远不应该是细节固体 (detail brushes)。细节几何图形不会创建可见性分支区域,并且 vvis 不会考虑这些几何图形。它会认为两个玩家都会看到对方,这不是我们想要的。vbsp 甚至可能会执行这个操作,所以这里的两个玩家都在同一片叶子里。
总之,由于 Hint 在游玩地图期间没有直接的渲染成本,因此如果使用得当,它们是加快地图速度和控制可见性的主要方法。
用于简化的 Hint
最后,Hint 可用于简化地图。有时,vbsp 会将一个关卡切割成比必要的更多的叶子。这会增加编译时间。Hint 可用于抵消这种情况。例如,可以在门口放置 Hint,以防止门口切割它们连接的房间。或者,如果你收到某个叶子的错误,指出某个叶子正在穿过太多其他叶子,则可以使用 Hint 将该叶子切成多个叶子,从而穿过较少数量的叶子。
另请参阅
- Visibility optimization
- Skip
- %compilehint,用于创建自定义 Hint 纹理。
- Optimization (level design)
示例
sourcesdk_content\hl2\mapsrc\sdk_hints.vmf
- Source SDK 中包含的示例地图。