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

可见性优化

From Valve Developer Community
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

参见