Portal 2

Portal 2

Not enough ratings
p0rtalmaster 的 Hammer 指南系列 12/19
By idontknow and 1 collaborators
您好,欢迎阅读我的迷你指南系列的第12/19部分,旨在帮助您了解 Portal 2 创作工具最大的组成部分:Hammer。

要获得该系列的超快速版本,请查看我的另一篇指南,《慌乱的 Hammer》
   
Award
Favorite
Favorited
Unfavorite
这是一个翻译副本 / This is a translated copy
原指南 / Original guide:
http://steamproxy.net/sharedfiles/filedetails/?id=662554219
本指南中出现的 “我” 均指原作者。/ All "I" in this guide mean the original author.

本指南存在许多翻译不当的地方,欢迎提出指正。/ There are many improper translations in this guide, please correct me.
简介
也许您已经在脑海里想起了一张地图(无论是谜题,一系列难题还是冒险),也许这张地图都是非常细节的。问题是,如果您不了解有关地图优化的一些基本知识,则可能需要很长时间才能进行编译。vvis 是让那些称为 visleaf 的东西工作的程序(我们将在下面的“可见性”部分中进行定义),将盲目地追踪地图可见性的每个小细节,在最坏的情况下,它可能会花费几个小时即可充分优化所有 visleaf / 可见叶!它必须这样做,在这篇 VDC Wiki 页面上非常清楚地描述了原因。

这是我最近发现的地图优化不佳的实际示例:



那么,我们如何摆脱这种丑陋的蓝色混乱局面并减少编译时间呢?继续阅读以了解常见技巧。
**** 泄漏 ****
我首先介绍这一点,因为如果有泄漏,编译器将不会为您提供优化地图所需的功能。

编译地图时,您是否曾经看到过一行红色的字(甚至只是一闪而过,然后编译器就退出了)吗?它基于一个简单的原理:除了画笔之外,没有任何东西可以触及地图周围的“空隙”,即使一个小孔也可以使地图无法游玩。因此,编译器可能还会说“Entity XYZ leaked! / 实体 XYZ(实体位置坐标)泄漏了!”画笔实体是一个例外:只要它们的原点在内部,就可以将实际的画笔置于地图的外部。

要解决这些泄漏,首先,请勿使用一个大盒子密封您的实验室。这实际上是不好的做法,部分原因是它添加了多余的不必要的 visleaves,这可能导致更长的编译时间和更差的性能。相反,请遵循以下过程:

1)Hammer 将生成一个可以加载的 pointfile(*.lin)(红色文本):



2)在地图上的某处寻找一条红线。在 2D 视图中的任何视图比例下都应该易于查看:



3)找到它之后,寻找它“out of bounds / 超出范围”的地方:



4)解决该问题,而不要使用“大盒子”把戏:P

您甚至可能根本不注意细节,而一个小孔让我们无视了。您也可能使用了错误的 nodraw 纹理来密封地图,或者使用 func_detail 或其他笔刷实体来密封地图。 如果线条通过以上任何一条并进入空隙,请检查笔刷及其纹理以查看是否遗漏了任何东西。我可以提供的另一条建议是在网格上工作——32是可以与世界画笔配合使用的良好网格大小(例如,箱壁,地板,天花板,致命的粘坑,甚至许多不是 Worldbrush 的测试元素) ,小于等于8仅用于细节(例如,overlay / 叠加层,decal / 贴花,prop / 道具,func_detail,门的对齐调整)。
可见性
优化可见性是 Portal 2 中最大的问题,比任何其他形式的优化都重要。这就是本指南的重点。

Visleaf
因此,您此时可能想知道“什么是 visleaf?”visleaf 是一个长方体形的盒子(以蓝色线框突出显示),有助于定义可见区域的“群集”(或简称为“可见集”)。除非您的地图只有一个 visleaf,否则每个 visleaf 都会碰到另一个 visleaf,而这两个 visleaf 是通过 portal 连接的。这完全不是我们听到时想到的那个 portal。它只是一个辅助,来确定哪些 visleaf 可能彼此可见的—— vvis 计算出的内容可以帮助减轻计算机的痛苦。在 Portal 2(实际上是所有其他 Source 游戏)中,Visleaf 是有必要的,因为它们可以减少需要绘制的对象的数量(不需要绘制当前可见集之外的所有对象)。如果必须始终绘制整个地图,则我们将有很多熔化的计算机(请记住,我们的计算机不像 Aperture 的计算机那样——它们不能承受高达4000开的温度)。

在开始优化过程之前,请注意,您甚至不必在游戏中运行地图并使用 mat_leafvis 命令。您可以通过称为 portal file(*.prt)的东西在 Hammer 中查看 visleaf。请原谅图像重用;仅关注蓝色文本:



注意:要使此工作正常,您至少必须编译地图的 BSP / 几何部分。您的地图也应该没有泄漏,因此,如果您没有阅读上一节的内容,现在如果您的地图有泄漏,现在应该是回头阅读的好时机。请记住,Aperture 不会发布任何东西,直到一切准备好并准备就绪,并且其中包括地图中的内容。

有关 visleaf 是如何被创建的几件事:
  • 在 Hammer 网格(2D视图)中的彩色粗线上,每1024个单位会创建一个 visleaf。这仅仅是将大区域分开,与您创建的画笔(墙壁,地板和天花板)无关。
  • 尽管取决于纹理,但所有画笔的边缘都会切开 visleaf。大多数纹理具有此切片属性,但是一些工具纹理(例如 clip)则没有。
  • 诸如 func_detailfunc_door 之类的画笔实体不会切开 visleaf,只有世界画笔才会这样。因此,如果您想根据需要制作复杂形状的旋转面板,那就去吧。
在本指南中提到的大多数实体都可以在这里相当宽松地使用,而不会增加地图的实体成本,因为一旦编写 BSP,它们便消失了——仅在处理时才需要。
Skip/Hint 笔刷
这些迫使编译器沿某个平面切一个 visleaf。创建一个很简单:只用 skip 纹理(tools/toolsskip)制作一个 Worldbrush,然后相应地放置画笔,然后在要切片的平面上使用 hint 纹理(tools/toolshint)。hint 纹理的唯一目的是将 visleaf 切片。skip 纹理对任何东西都没有影响,这就是为什么在 hint 笔刷中它很有用。当使用实例(或那些半不推荐使用的预制件)时,它对于轻松选择也很有用。它在游戏中具有非常特殊的效果,因为(例如)下图中的格栅不受任何其他平面的约束(这就是 BSP 的工作方式——不是由顶点而是由平面)。VBSP 会在编译之前删除所有 skip 笔刷:



这意味着您不必一定要拉伸 skip/hint 笔刷来适合您的孔(或您要填充的任何东西),但是无论如何都是一个很好的实践。

通常,这些笔刷的目的只是为了减少 visleaf:



但是还有更多。考虑上面的房间。不加 hint,Bendy(纸片小人)可以以某种方式“看到”(致命的坑)坑中的东西。而且,Bendy 并不总是“看到”该坑另一侧(第3部分)的东西。那根本没有道理。现在有了 hint,Bendy 只能看到本该看到的:整个腔室和凹坑是分开的,因此,如果您在那里有致命的黏液,visleaf 将不会被绘制出并占用计算机额外的资源 。(此外:在实践中,将按照第二个图表进行配置,而没有 hint,但这仅是 hint 过程如何工作的说明。)

让我们看一个真实的例子:



还有:



最后一件事要知道,特别是如果您正在处理主题过度的地图(通常有很多天花板细节):



对于更复杂的区域,如果您尝试使用 func_detailfunc_viscluster(如果适用),但是仍然存在问题,那么这些 skip/hint 画笔就可以为您提供帮助。最初使用它们一开始可能会令人生畏,但是以这种方式思考:用 trigger 笔刷填充整个腔室的最简单方法是什么?portal 文件是否反映了这一点?如果不是,则使用 hint 来确保确实如此。好的候选方式通常是墙壁上的小洞或大洞。其中包括条形灯和观察室,但也许在您的测试室内也有一些类似洞穴的区域。门口也可能是 skip/hint 笔刷的好地方。

为了在此优化阶段减少混乱,您可以取消选中“Entities / 实体”和“World Detail / 世界细节”自动创建的视觉组,如下所示:

func_viscluster


如果您在较大的空间中有 visleaf,但需要它们全部作为一个 visleaf,则此简单的画笔实体很有用。Valve 在测试区域(细节不多的地方)之外的 Wheatley 主题地图中使用了此实体,以大大减少了 visleaf 数量和编译时间。

例如,这是我的一张地图的编译日志中的一些结果:

没有 func_viscluster:
visdatasize: 216351, compressed from 294576 6 minutes, 8 seconds (368 seconds total) elapsed
有 func_viscluster:
visdatasize: 161316 (approx. 25% reduction), compressed from 246272 36 seconds elapsed
通常,在使用 func_viscluster 时,使用 vvis 的数字会更少。

要创建一个 func_viscluster,只需制作一个画笔(最好是大画笔),然后在其上使用 trigger(tools/toolstrigger)纹理即可。然后使用“Tie to Entity”功能将其转换为 func_viscluster。做完了无需设置任何特殊的键值,也无需在此实体上使用 I/O。
func_detail
如果您的地图上有很多永远不会动的笔刷,请将它们变成 func_detail。作为画笔实体(如果您没有更改 Hammer 的设置,它是默认的),func_detail 不会像普通的 Worldbrushes 那样砍断 visleaf。创建很简单:只需选择画笔,使用“Tie to Entity”功能将其变成 func_detail——无需设置任何键值,也无需在该实体上使用 I/O。选择画笔的好候选是:
  • 圆形/曲线笔刷:它们有很多面,最好将其变成 func_detail。例如,最好将其中带有圆孔的东西变成 func_detail
  • 小型或细笔刷:例如玻璃和格栅上的框架,甚至玻璃和格栅刷本身。
  • 其他特殊情况:例如,在 Wheatley 主题测试之外的光束结构通常变成 func_detail 来节省 visleaf。
注意:如果其中任何一个接触到空隙(例如,您有一个弯曲的测试室墙壁),则需要使用 nodraw 将其密封。



func_detail 可以被制作的情况是当您尝试编译而又不知道什么是func_detail时,而且这需要永远。一般的想法是,worldbrush 应该相当简单并且与网格对齐(谢天谢地,这是 Portal 2 的典型代表)。几个奇角(例如45°角)不会受到伤害,但是如果它变得比这复杂得多,则需要 func_detail。使用func_detail 的缺点是,在 func_detail 画笔上照明不会像在 Worldbrush 上那样清晰漂亮。

有趣的事实:在编译地图时,无论您的地图中有多少 func_detail,编译器都会将它们全部合并为一个,因此请继续使用此实体,并根据需要进行调整。
为什么 Nodraw?
为什么所有 Hammer 专家都痴迷于在他们通常不期望玩家看到的位置使用 nodraw? 这是因为没有为它编译任何光照贴图,因此可以节省文件空间。出于相同的原因,它可能还有助于节省 vrad(照明)期间的编译时间,该阶段通常是耗时最长的地图编译阶段。

但是,让我们所有人都从旧的 Portal 2 mod Aperture Tag 中吸取教训:不要在您认为玩家永远看不到的每个小地方都疯狂地拖着 Nodraw!在那个 mod 中,玩家找到了使用蓝色凝胶的方法,并且可以到达可以清晰发现 nodraw 的地方。如果您是 Hammer 新手,我建议您仅使相互接触以及与外部接触的画笔的表面纹理成 nodraw。

现在,您可能已经注意到,纹理浏览器中有一个 nodraw 纹理(tools/toolsnodraw)和一个可 portal 的变体(tools/toolsnodraw_portal)。您将永远不需要使用可 portal 的变体,实际上这样做可能会给您的谜题带来危险。还有另一个 nodraw 变体:glass footsteps / 玻璃足迹(tools/toolsnodraw_glass_footsteps)。它在第一张玩家突破玻璃(仅用于 foley 效果)的官方 Portal 2 地图中被使用。尽管它是 nodraw 纹理,但它不会密封泄漏!
Area Portal
我在这里要介绍的最后一件事是 Area Portal。不,这些并不像我们最喜欢的蓝色和橙色椭圆形东西,也不像 world portal 一样,它们只是为了确保您的计算机可以更轻松地休息。有两个主要实体:func_areaportalfunc_areaportalwindow。两者都旨在减少长距离绘制的影响——不会绘制封闭 area portal 后面的所有内容,以使您的计算机在尝试运行带有可燃柠檬的巨大地图时不会崩溃和燃烧。

Area Portal 与 Visleaf
area portal 对 visleaf 有什么影响?真的没有。它们只是通过在游戏中运行地图时实质上“切除”部分地图来减少绘制距离。您会看到,visleaf 仅受到地图,func_viscluster 和 skip/hint 画笔的几何形状的影响。它们打算在地图运行之前进行优化,而 area portal 则是在地图运行时对其进行“优化”。

“在哪里放置它们……”您可能想知道。几乎在可以放置 skip/hint 笔刷的任何地方,对于 area portal 来说都是不错的地方,但是较小的孔和门口确实是使用它们的最佳场所。测试室的入口和出口是使用 area portal 的好例子,但在测试室的中间则没有那么多。



关于 func_areaportalwindow 的一些知识:只需设置门的“Area Portal Window Name”键值为 func_areaportalwindow 的名称,就可以将 prop_testchamber_door 与其绑定在一起使用。执行此操作时,func_areaportalwindow 将自动随您的门打开和关闭,而无需其他 I/O。

警告:发生常规泄漏,Portal 2 地图不会编译。但如果存在 area portal 泄漏,则它们会编译,这会使您的地图看起来很糟糕。因此,如果在编译过程中看到红字闪烁,请停止编译,并在需要时阅读编译日志(与 VMF 文件位于同一位置),并修复这些 area portal 泄漏!pointfile 文件也可以在这里提供帮助——在这种情况下,它将找到从 area portal 到另一侧的开放路径。

作为最后的建议,area portal 不一定总是必需的,实际上,没有它们就可以很好地优化 Portal 2 地图。只有在两个非常细节的区域之间使用它才真正值得。
避免错误和更多信息
  • 如上所述,过多的 nodraw。
  • 如上所述,太少的 nodraw。
  • 不正确使用 area portal。
  • 但最重要的是,忘记优化地图是这里最大的错误。如果优化地图,您将制止卡顿问题(如果不是您的,则是别人的)。您还将受益于不浪费时间,因为编译器需要花费999999 ...秒才能完成。

来自 VDC Wiki 的更多信息:

特别感谢...
我要特别感谢 Nintendo.erk,他为我提供了一些截图中的地图,同时也帮助我更好地了解了优化 Hammer 地图的过程。我还要感谢 Innocentive 对优化过程的宝贵见解以及对本指南的调整。
主指南列表
请注意,部分工作仍在进行中。当我为您完成更多指南时,本节将更新!

您当前正在查看该系列的第12/19部分。

| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |

上一指南(杂项有用的东西)
下一指南(关于电梯间以及开始和结束单人游戏地图)

请随时在下面留下一个合理的问题或评论。我或合格的实验室助理(您会知道,因为他们在 workshop 中制作了所有好的地图)都会做出回应。 如果您的问题或评论不合理,我建议您再次阅读我的指南,直到您100%理解它们。 这里不需要或将不需要进一步的信息,使用 Hammer,您将成为出色的实验室设计员!