Zh/Hint brush: Difference between revisions

From Valve Developer Community
< Zh
Jump to navigation Jump to search
No edit summary
(Replaced content with "{{delete}}")
Tag: Replaced
Line 1: Line 1:
{{language subpage|Hint brush|title=Hint 固体}}
{{delete}}
{{:User:1416006136/Signature|time=2023年1月1日|machine=1}}
{{back|Tool textures#hint|Tool Textures}}
[[File:Toolshint.gif|left|link=]]
Hint 平面用于在编译时拆分[[visleaf|可见性分支区域]],因此是优化 [[VVIS|Vis]] 地图编译阶段结果的一种方式。
 
它们通常被称为 Hint [[Brush|固体]],因为它们以与普通世界固体相同的方式放置在地图中。Hint 平面由覆盖有 <code style=padding:0>tools/[[tool textures#hint|toolshint]]</code> 纹理的固体的一个边定义。可以通过为固体的多个边添加纹理或使用多个固体来定义多个 Hint 平面。固体的其他不充当 Hint 平面的一侧必须用 <code style=padding:0>tools/[[tool textures#skip|toolsskip]]</code> 覆盖;编译器将忽略这些面。
 
Hint 会自动绑定到其自己的[[VisGroup#VisGroups|自动可见组]],因此你可以轻松隐藏它们。
 
== 为什么以及什么时候切分可见性分支区域 ==
{{note:zh-cn|了解[[visleaves|可见性分支区域]]如何工作可能有助于你理解本文。}}
 
有时,某些叶子(即“可见性分支区域”)形状比其他形状更受欢迎,仅仅是因为这种形状使这些叶子看到更少的其他叶子。每当看不到叶子时,就不会绘制叶子的内容,从而加快渲染速度。
 
下面说明了叶片切割的重要性,同时提供了提示有用的示例。
 
第一个示例与 [[#Examples|SDK 示例地图]]几乎相同。这是一个单人房间的侧视图,玩家和管道被一堵墙隔开:
 
[[Image:Hint example1.jpg|frame|left|caption|sdk_hints.vmf 示例地图的侧视图,玩家从左侧开始,模型在右侧,由一堵墙隔开。]]{{clr}}
 
当玩家处于两个 player_start 中的任何一个时,引擎必须考虑是否应该绘制墙壁右侧的固体(管道)。发生这种情况是因为 <code style=padding:0>vbsp.exe</code> 没有采取最有效的方式将我们的关卡划分叶子:
 
[[Image:Hint example2.jpg|frame|left|caption|没有任何 Hint,vbsp 制作了一直延伸到天花板的叶子。]]{{clr}}
 
因为叶子很高,一直到天花板,所以左边的叶子(和玩家一起)可以用管道直接“看到”右边的叶子。因此,引擎将绘制叶子和内容物(管道)。很遗憾,因为从玩家的角度看不到这些管道(它们在中间的墙后面)。我们可以使用 Hint 来引导叶子制作过程。
 
[[Image:Hint example3.jpg|frame|left|caption|创建单个水平 Hint 会创建多个叶子,并且墙两侧的两片叶子无法相互看到。]]{{clr}}
 
白线是带有工具 <code style=padding:0>tools/toolshint</code> 纹理的画笔的一面。它迫使 <code style=padding:0>vbsp</code> 将我们的地图分成三片叶子。在这种情况下,不能再有一条从玩家所在的叶子到管道所在的叶子的直线。这就是 Hint 的本质。
 
[[Skybox|天空盒]]有时有点高,导致玩家在城市中看到很多东西,因为他们所在的叶子可以看到房屋(如上例所示)。这也是一个很好的情况,我们可以使用 Hint 来阻挡可见性。
 
== 角落 Hint ==
[[Image:Hint example5.JPG|thumb|200px|right|caption|如果没有 Hint,当站在对面的角落时,这条走廊的任何角落都会被渲染。]]
 
这是一个典型角落的俯视图。有两个玩家(绿色盒子),两端的圆柱代表了很多引擎要绘制的东西。在这种情况下,Hint 的目标是避免在不必要的情况下渲染对象,例如,当玩家在远离对象的拐角处时。
 
有人可能会认为 <code style=padding:0>vbsp</code> 会确保每个玩家不会看到属于另一个玩家的对象。这是错误的。它将这个空间分成两片叶子,沿着棕色或粉红色的线切割叶子(取决于 <code style=padding:0>vbsp</code> 首先切割哪个固体面)。
 
无论哪种方式,两个角落的叶子彼此直接可见,因此当站在相对的角落时,每个角落的内容将始终渲染。{{clr}}
 
[[Image:Hint example4.jpg|thumb|200px|right|caption|添加倾斜的 Hint 画笔会创建无法看到彼此的角落叶子。]]
 
只需在角落放置一个 Hint,将我们的关卡分成三片叶子(总共三片而不是两片),但要确保一个玩家的东西不会从另一个玩家的角度渲染,就可以大大改善这种情况。
 
红色和棕色叶子之间没有直接的视线,因此避免了不必要的渲染。但是,如果其中一个玩家进入绿色的叶子,他们将看到自己和另一个玩家的东西都被渲染。你无法用 Hint 来阻止这种情况。阻止这种情况的唯一方法是更改关卡布局或使用其他方法,如[[Controlling Geometry Visibility and Compile Times|控制几何可见性和编译时间]]中所述的方法。{{clr}}
 
== 更多示例 ==
[[Image:Hint example6.PNG|frame|caption|right|使用 Hint 的各种方法。]]
 
以下是何时以及如何使用 Hint 的几个示例。在所有情况下,目标都是将绿色玩家彼此隐藏起来。上面的三个工作正常。左边的那个说明,即使它的一个 Hint 固体跨越角落也无关紧要,只要它的角度 > 180&deg;,两个玩家就不会“看到”对方的叶子,因为他们的叶子之间没有一条直线连接。左下角的示例显示了当角度小于 180° 时可能会发生何种情况。我们可以很容易地从叶子到叶子画一条直线,导致非功能性 Hint(Hint 没有达到它的效果)。
 
当走廊的拐角是 180&deg; 时,如中间顶部图片所示,两个 Hint 就足够了。事实上,他们甚至可以更接近玩家,但这会降低他们的效率(更多的东西将在“拐角处”绘制。在中间底部的示例中,Hint 的高度已降低,<kbd>vbsp</kbd> 被迫切割顶部的 visleaf,因为 visleaf 不能是[[concave|凹形]]。无论 <kbd>vbsp</kbd> 如何切割这个角落,Hint 总是会降低工作效率并创建额外的叶子(vvis 的更多计算)。在示例中,左侧玩家可以看到叶子 1 和 2(与上面的面相同),但右侧玩家将看到所有三个编号的叶子(这比顶部示例更多)。
 
右边的两张图片告诉你,你应该让事情尽可能简单。如果一个 Hint 就足够了,如上例所示,则首选。而且,显然,如果不需要,则不应使用 Hint,如下图所示。如图所示,<kbd>vbsp</kbd> 无法创建使两个玩家都能看到对方的叶子,因此这里不需要使用 Hint 来隐藏玩家(当然,可以使用 Hint 来隐藏走廊的某些部分)。在同一示例中,中间墙''永远不应该''是[[func detail|细节固体]](detail brushes)。细节几何图形不会创建可见性分支区域,并且 <kbd>vvis</kbd> 不会考虑这些几何图形。它会认为两个玩家都会看到对方,这不是我们想要的。<kbd>vbsp</kbd> 甚至可能会执行这个操作,所以这里的两个玩家都在同一片叶子里。
 
总之,由于 Hint 在游玩地图期间没有直接的渲染成本,因此如果使用得当,它们是'''加快地图速度和控制可见性的主要方法'''。
{{clr}}
 
== 用于简化的 Hint ==
最后,Hint 可用于简化地图。有时,<kbd>vbsp</kbd> 会将一个关卡切割成比必要的更多的叶子。这会增加编译时间。Hint 可用于抵消这种情况。例如,可以在门口放置 Hint,以防止门口切割它们连接的房间。或者,如果你收到某个叶子的错误,指出某个叶子正在穿过太多其他叶子,则可以使用 Hint 将该叶子切成多个叶子,从而穿过较少数量的叶子。
 
{{note:zh-cn|Visleaf 将始终每 1024 个单位划分一次(在 2D 视图中的每一条红线或蓝线处)}}
 
== 另请参阅 ==
* [[Visibility optimization]]
* [[Skip]]
* [[Material_Flags#.25CompileHint.28toolshint.29|%compilehint]],用于创建自定义 Hint 纹理。
* [[Optimization (level design)]]
 
== 示例 ==
* <code>sourcesdk_content\hl2\mapsrc\sdk_hints.vmf</code> - Source SDK 中包含的示例地图。
[[Category:Glossary:zh-cn]]
[[Category:Level Design:zh-cn]]

Revision as of 12:29, 12 July 2023

Warning icon.png
This article has been marked as a candidate for speedy deletion.
If you object to this decision, then please discuss why here (If you make a discussion section also create this redirect page). If this page doesn't meet the criteria for speedy deletion, then please remove this notice, but do not remove it from pages that you have created yourself
Administrators / Moderators - Remember to check if anything links here and the page history before deleting.