这篇条目有关 "金源" 引擎。如需详情,点击这里。
这篇条目有关 Source引擎。如需详情,点击这里。

可见性优化

From Valve Developer Community
< Zh
Revision as of 22:08, 27 June 2025 by WoShiGeNiCheng (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
English (en)Español (es)Français (fr)Русский (ru)中文 (zh)Translate (Translate)

edit
Broom icon.png
This article or section needs to be cleaned up to conform to a higher standard of quality because:
本文最初仅涵盖起源 起源内容,现已添加金源 金源相关信息(因多数概念通用)。但仍有大量Source专属内容未明确标记,且未提及ZHLT(en)和当前标准VHLT(en)提供的优化功能。
For help, see the VDC Editing Help and Wikipedia cleanup process. Also, remember to check for any notes left by the tagger at this article's talk page.

若不使用VIS(en),地图中的所有内容都会持续渲染(无论玩家是否可见),这将严重影响游戏性能(和帧率)。显然需要精简渲染对象列表,但如何实现?若逐一测试每个对象或表面的可见性,耗时将远超直接渲染!

游戏引擎采取折中方案:金源 金源起源 起源均采用基于Wikipedia icon 约翰·卡马克雷神之锤 雷神之锤中实现的二进制空间分区(BSP)(en)模型。本页详解其工作原理及优化方法。

空间分区

走廊中的可视分区(Visleaves)

BSP地图的内部空间(即未被世界笔刷(en)占据的区域)被划分为可视分区(en)。这些3D空间之间的可见性关系在地图编译时计算,并嵌入地图文件供引擎调用。与笔刷相同,分区始终为凸面体。

左图展示了U型走廊可能产生的分区(为清晰展示添加了间隙)。分区1与3之间无视线连接,因此当摄像机位于其中一个分区时,另一个分区的内容不会渲染。引擎只需查询地图内嵌的可见性图表即可完成此判断。

但分区2存在问题:当摄像机位于该分区时,[[Zh/

File:Frustum culling.png|视锥剔除]](en)之外,所有三个分区的内容都会被渲染——即使左侧墙面已完全遮挡视野。后文将介绍解决工具,但请注意:多数情况下,修复问题的性能消耗可能高于直接渲染非最优场景。

重要提示:

Note.png注意:使用$translucent材质的世界笔刷会切割可视分区(en)
Warning.png警告:地图存在泄漏(en)时将无法生成分区。
Tip.png提示:分区会每1024单位(en)自动在xy平面分割(无视笔刷几何体),Hammer网格线可辅助适配此规则。
Note.png注意:分区在垂直方向同样生效,天空应视为下方街道/房间的延伸。

优化VIS编译时间

VVIS(en)金源 金源中为VIS(en)/HLVIS(en))负责计算分区间的可见性(而VBSP(en)(或QBSP2(en)/HLBSP(en))创建分区)。即使最复杂的地图也应只需数分钟完成编译,若超时请尝试以下方案:

  • 合理使用Detail笔刷
  • 尽量使世界笔刷(en)对齐网格,优先采用2的幂次尺寸
  • 避免过度使用雕刻/顶点编辑等工具修改基础笔刷
  • 在视野开阔区域放置func_viscluster(存在于自 半衰期2:第二章 以来),其内部分区将被视为相互可见
  • 避免创建无交互的大型开放区域,用3D天空盒(en)缩减天空尺寸,并为位移贴图(en)添加基底笔刷

请注意:VIS编译时间与游戏性能是两回事。若缩短编译时间会损害优化效果,延长编译可能是值得的。

检查分区

起源2007 起源2007起,Hammer新增"地图 > 加载门户文件"功能,可在3D视图中用蓝色粗线显示分区边界。若关闭VIS/RAD编译后重载门户文件,可快速观察修改效果。

起源2006 起源2006及更早版本需使用glview(en)工具。

Tip.png提示:使用自动可视分组(en)隐藏不影响可见性的对象(通常仅保留"世界几何体"、"工具笔刷"、"水体"和"位移贴图")可获得更清晰视图。

游戏内检查方法:

 * mat_leafvis 3:显示PVS(en)中所有分区轮廓
 * mat_leafvis 1:仅显示当前分区轮廓(需开启sv_cheats
 * mat_wireframe 1:显示PVS(en)中的多边形绘制(需开启sv_cheats

提示分割

主条目:  Hint brush
tools\toolshint
未使用提示分割时所有分区同时渲染

当分区可见性不理想时(如左图所示所有分区相互可见),需使用提示分割:将特殊材质tools\toolshint应用于笔刷表面可分割相交分区(无需分割的面应使用tools\toolsskip)。示例中沿紫线放置提示分割后,分区1和3将恢复为首图的理想状态。

提示分割会产生额外分区(如图右侧将出现三个新分区),但性能影响有限。

Tip.png提示:可用提示分割隔离昂贵(en)低廉(en)区域,减少高消耗区域的渲染时长。

Detail笔刷

func_detail内部实体(en),可使编译器在计算可见性时忽略指定笔刷(同时保留其他功能)。地图中常有大量笔刷转为Func_detail笔刷(en)

无绘制表面

tools\toolsnodraw, in Source
NULL, from ZHLT.WAD and HLBASICS.WAD

若玩家在非作弊/旁观模式下无法看到某笔刷面,应为其应用特殊材质toolsnodraw(存在于 起源 之中))或NULL纹理((存在于 金源 之中))。无绘制表面会在编译时移除(不影响可见性计算),既减少渲染负担又缩小地图文件体积(无需计算光照贴图(en))。

注意:

  • 接触虚空(地图外部)的面无需无绘制
  • 同一实体(含世界实体)内相邻笔刷面无需无绘制(详见Brush#In-game(en)
Tip.png提示:(存在于 起源 之中)中VBSP会将所有func_detail合并,因此紧密接触的detail笔刷面无需无绘制(除非使用透明材质)。
(存在于 金源 之中)中HLCSG会移除同级或与低级detail接触的detail笔刷面。

区域门户 (存在于 起源 起源 之中)

主条目:  Areaportal
tools\toolsareaportal
青绿线标记理想区域门户位置

当提示分割无效时(如左图所有分区互见),应在关键通道口创建区域门户(en)。这会强制引擎进行逐对象视线检测(虽违背BSP/分区系统的初衷),但由于检测仅当摄像机看向门户时触发,若能遮挡足够多对象仍可提升性能。

图示四个门户位置中,通常仅需在右侧大型开口设置门户,走廊部分可保持原样。(理论上可用大量精确角度的提示分割实现类似效果,但得不偿失。)

Tip.png提示:区域门户可完全关闭以高效(en)阻断视野,建议为所有无窗门添加。
Note.png注意:区域门户不考虑其前方的对象。
Warning.png警告:错误放置会导致问题,务必仔细阅读文档(en)

遮挡器 (存在于 起源 起源 之中)

tools\toolsoccluder

当需要隐藏分区系统无法处理的模型时(如可破坏墙体后的高消耗角色模型),可使用遮挡器(en)。启用后,它会隐藏其后方的模型(非笔刷),且应完全嵌入不透明物体内。

通过Propper(en)等工具将笔刷转为模型后,可用遮挡器隐藏更多内容(建议在detail笔刷(en)上操作)。

绘制距离

对于无遮挡的开放区域,除减少细节外,还可使用雾效(en)配合farz参数控制绘制距离。

选择性淡出设置:

  • 通过Start/End Fade Dist/Pixels键值(en)控制prop_static等实体的淡出
  • 根据Screen Space Fade选择按单位距离或屏幕像素计算
Tip.png提示:所有含模型的实体及覆盖层(en)均可淡出,但多数情况下这些键值不存在于FGD!

淡出距离差值建议设为200,既保证视觉效果,又避免过长过渡带增加渲染排序负担。

特殊实体func_lod也可淡出,但其关联笔刷不能用于其他实体。

示例地图

  • sourcesdk_content\hl2\mapsrc\
    • sdk_func_detail.vmf
    • sdk_hints.vmf
    • sdk_occluders.vmf

参见