VoxelDig体素地形项目
入门与实现 · UE 5.8.3 · 2026-10-18

体素地形:从内部数据到挖掘更新

从“怎样在山体里挖出一个洞”开始,依次理解内部采样、可见表面和碰撞,再在三维演示中观察一次完整更新。

查看各阶段 CPU、GPU 与内存开销 →
01

先明确目标:从侧面挖出一个洞

我们希望玩家能从岩壁侧面挖进去,同时保留洞顶和洞底。因此,系统需要知道山体内部哪里有土石,哪里是空气。

只记录一层地表高度

同一个位置只描述一个高度,无法单独表示洞顶与洞底。

记录山体内部的实与空

内部也有记录,因此可以在土石中保留一段空气。

这是二维剖面示意。单一高度面需要额外几何才能表达洞穴;本项目用体积数据表达内部。

这里的“体素地形”,指的就是用空间中的数据描述地形体积。下一步先看这些数据具体记录什么。

下一步:内部如何记录 →
02

每个采样位置,记录有多少土石

把空间划成有规律的采样格。每个位置记录一个占据量:接近“实”表示有土石,接近“空”表示空气;中间值帮助确定边界的位置。材料类别另行记录它属于哪种土石。

采样是内容

数据块是管理分组

点表示采样,外框表示分组。图中分组仅作说明;工程实际以 8³ 样本块组织数据。

采样点不是画面里的小方块。“数据块”也只是存储分组。分块后,挖掘可以只修改附近的数据,而不必复制整座山。

下一步:数据怎样变成表面 →
03

从实与空的交界,生成可见表面

有了内部数据,系统再寻找从“实”变成“空”的位置。将这些位置连接成三角形,就得到用于显示的网格。表面可以落在采样点之间,所以画面不必呈现为一堆立方体。

同一份内部数据

找到边界后生成表面

线表示采样之间估计出的边界,不是预放的洞口模型。实际三维处理中,表面由三角形组成。
地形数据
记录内部的实、空和材料。
表面网格
从数据生成,负责画面显示。
碰撞几何
供角色接触、射线等查询使用。
下一步:挖掘后怎样更新 →
04

一次挖掘,沿这条链传递

挖掘首先修改的是数据。洞口的画面和碰撞,都是这次修改的后续结果。

  1. 01改数据

    把笔刷范围内的部分土石改为空气。

  2. 02找受影响块

    复制并写入变化块,其他块继续共享。

  3. 03生成新网格

    从修改后的实、空边界生成新表面。

  4. 04准备新碰撞

    从新表面建立新的三角形碰撞。

  5. 05切换资源

    让新网格与新碰撞接管显示和查询。

逻辑顺序示意,不表示各阶段耗时相同。真实 UE 按节点处理,并在后台执行相应任务。

新资源准备好之前,旧表面和旧碰撞先保留。这样玩家不必等待所有计算完成,也不会因为新碰撞尚未生成就突然失去脚下的地面。

下面用同一份三维数据逐步执行这条链。先观察完整山体,再提交一次挖掘。

下一步:在三维中逐步观察 →
05

把这条更新链,放到三维中观察

先拖动视图看看完整山体,再点击“提交挖掘”。之后每推进一个阶段,都对应上面更新链的一步。V0 表示本轮编辑前的版本,V1 表示第一次编辑后的版本。

一次挖掘的三维过程旋转查看山体,提交挖掘,再逐步推进。“随更新阶段切换”会依次显示数据、网格和碰撞;也可手动切换观察对象。
正在初始化三维演示…
拖动旋转 · 滚轮缩放 · 右键平移 · 点击岩壁定位笔刷
实面 / 当前资源橙色 / 修改及待发布蓝线 / 当前碰撞
  1. 01 编辑前
  2. 02 改内部数据
  3. 03 生成新表面
  4. 04 准备新碰撞
  5. 05 切换完成
初始化完成后可提交挖掘。
世界数据
V0
已发布网格
V0
当前碰撞
V0
本轮修改
0 采样 / 0 块
碰撞射线检查—沿笔刷入射方向查询浏览器中的三角形。蓝点为当前碰撞命中,橙点为待发布碰撞命中;距离不是时间或性能数据。

可以在新洞壁上再次点击并提交挖掘,继续向内延伸。这是实际计算数据、网格和三角形命中的浏览器教学模型:它用小场景全量生成网格,编辑采用球形空腔合并,不执行 UE 的材料工作量、自定义过滤、LOD、线程任务或 Chaos 烹饪。剖切仅影响显示;距离不是耗时。刷新页面恢复初始场景。

现在可以区分三件事:数据描述内部,网格显示表面,碰撞负责接触查询。三者来自同一份地形状态,但完成更新的时刻不同。

继续阅读:这条更新链的性能开销 →
测量

这条更新链,消耗多少资源

下面是 UE 地图的实际采样,与上方浏览器教学演示分开。先看一次修改在哪里花时间,再看整帧与内存;未单独测量的部分直接保留为空缺。

2026-10-18 · UE 5.8.3 · 1920 × 1080 · 不限帧

i9-14900KF / RTX 5070 12 GB / 64 GB。Development Editor -game、D3D12 SM5、100% 渲染比例,四阶段各 30 秒,阶段首尾各去除 0.5 秒。未检测到其他游戏进程;采用离屏产帧,不能当作屏幕呈现 FPS。

小 / 大笔刷在固定中心交替挖填,间隔分别为 0.34 / 0.12 秒。本轮没有 Lumen、水体求解、烟雾、正式植被、AI 和完整角色负载。

每笔编辑一次操作产生的工作。
每个活动帧只看本帧确实安装或发布资源的样本。
更新延迟后台工作、排队和资源就绪共同形成的等待。

0.75 m 小笔刷:有效帧 15,011,接受编辑 85 次,更新组稳定 85 次。两者按各自记录时刻归档,跨阶段完成的组可能使数量不同。下图分别统计真实发生工作的样本,不用空闲帧稀释开销。

修改内部数据0.241 ms / 笔
主线程;含快照、局部读取、编辑、清理与父层更新。
最慢网格任务3.958 ms / 任务
后台线程;每组先取最长 MeshNode,再统计 P95;不含随后的 Section 预整理。
安装网格资源0.200 ms / 活动帧
主线程;只统计发生安装的帧;包含碰撞任务提交,不含后台烹饪。
发布节点资源0.124 ms / 活动帧
主线程;只统计发生发布的帧,包括可见性与碰撞挂接。

条长以 8.333 ms 为参照。四条的统计单位不同,不能相加;安装软预算 0.35 ms 是限流参数,不是耗时保证。

逐步查看 CPU、GPU 和内存归属
步骤CPU 计时与范围GPU 工作内存 / 显存
01 命中与笔刷定位未单独测量;本轮使用固定中心直接编辑。CPU 查询;无独立地形计算 Pass。未做该步骤分配追踪。
02 修改数据与更新父层0.241 ms / 笔CPU 执行;不向 GPU 写整个体素世界。本轮对齐编辑数组:8.00 KiB;压缩节点、COW 和容器开销另计。
03 失效、LOD 与排队与地形 Tick、安装及发布存在包含关系;未独立隔离。CPU 调度;后续渲染更新另计。节点状态、通知、在途快照;独立增量未测。
04 读取 / 过滤 / 网格 / 打包3.958 ms / 最长任务本地图走 CPU 网格生成;没有对应 GPU 计算 Pass。单个 Level 6 任务固定数组约 632.94 KiB;几何输出另加。
05 UE Section 预整理位于后台 PrepareUploadMesh;不在 MeshNode 计时内,未单测。CPU 建立上传结构;GPU 资源随后创建。还会建立 FProcMeshSection 顶点 / 索引副本,未独立采样。
06 安装与碰撞提交0.200 ms / 活动帧GPU 资源创建与传输未独立计时;不能记为 0。旧资源、新 Section 和在途渲染资源可能同时存在。
07 Chaos 碰撞烹饪异步执行;独立 CPU 工作时间尚未测量。该路径为 CPU 碰撞;不使用 GPU 流体或粒子碰撞。三角形碰撞与加速结构尚未单独归属。
08 节点发布与旧资源回收0.124 ms / 活动帧渲染状态切换 / 延迟释放未独立归属。共享引用与旧资源释放时机决定峰值;本轮未分配追踪。
09 持续显示新地形整场景 Game Thread P95 1.343 ms,不是地形单项。整场景 GPU CSV P95 1.589 ms;RHI 口径 1.576 ms。进程内存峰值见下;不能当作地形独占量。

这次修改,要等多久才稳定

修改开始 → 更新组稳定24.424 ms
各 MeshNode 耗时累加13.164 ms
最后安装 → 更新组稳定4.283 ms

以上均为 P95。第一项是整段延迟;第二项把并行任务累加,不能当成单帧卡顿;第三项还包含帧对齐、调度和碰撞就绪等待,不是 Chaos 的 CPU 耗时。

网格输出有多大

该阶段每更新组生成的 CPU 数组内容 P95 为 2.375 MiB。该值是生成量,包含多个节点,不是同时驻留峰值,也不是 GPU 上传字节或显存占用;Section 副本、碰撞、容量余量和旧资源均另计。

查看此阶段的 GPU 绘制开销
BasePass · 地形、树草及其他不透明物体未单独测量
该 Pass 的整场景 P95;未隔离地形。
阴影深度0.142 ms / 帧
该 Pass 的整场景 P95;未隔离地形。
深度预通道0.041 ms / 帧
该 Pass 的整场景 P95;未隔离地形。
屏幕空间环境遮蔽0.234 ms / 帧
该 Pass 的整场景 P95;未隔离地形。
TAA0.097 ms / 帧
该 Pass 的整场景 P95;未隔离地形。
后处理0.121 ms / 帧
该 Pass 的整场景 P95;未隔离地形。

图中不是完整 GPU 分解。GPU Pass 可能跨队列重叠,各自 P95 不可累加;这里也没有把整场景 BasePass 误写成“地形绘制成本”。

能否留出 120 Hz 的空间

本轮离屏采样的 P99 均低于 8.333 ms。120 Hz 每帧约 8.333 ms;当前为整款游戏预留的目标是主线程 6.0 ms、GPU 7.0 ms。CPU 和 GPU 有流水并行关系,不能把二者相加计算帧时间。单轮基础地图通过某个数值,也不能替代完整玩法验收。

测试阶段整帧 P95 / P99主线程 P95GPU CSV / RHI P95超过 8.333 ms 的帧
静止观察2.404 / 2.649 ms1.241 ms1.632 / 1.579 ms0 / 15,105
0.75 m 小笔刷2.411 / 2.656 ms1.343 ms1.589 / 1.576 ms1 / 15,011
2.50 m 大笔刷2.492 / 2.755 ms1.583 ms1.577 / 1.566 ms0 / 14,566
移动相机2.449 / 2.697 ms1.498 ms1.722 / 1.669 ms1 / 14,702

分项仍有约束:编辑、LOD 与调度共分配 0.45 ms,大笔刷仅数据修改的 P95 就有 0.495 ms,已经超过这份配额。安装与发布按活动帧合计,小 / 大笔刷 P95 为 0.259 ms / 0.338 ms,本轮低于 0.50 ms 配额。它们是两组统计,不能拿各自 P95 再相加推算最坏帧。

内存要分成“整个进程”和“单个任务”看

资源本轮结果 / 计算容量含义
整个 UE 进程 · 工作集峰值2.549 GiB低频采样,包含启动、引擎、地图和测试记录。
整个 UE 进程 · 私有提交峰值2.951 GiB虚拟提交;与工作集重叠,二者不能相加。
该 UE 进程 · 专用显存峰值476.738 MiBWDDM 进程采样;包含场景、纹理、渲染目标及引擎资源。
8³ 个 16 位样本1.00 KiB未压缩的内容大小;压缩节点与对象实际开销不同。
0.75 m / 2.50 m 编辑缓冲8.00 KiB / 64.00 KiB按本轮固定中心与对齐算法计算;不是测到的分配峰值。
压缩节点内容 · 测试结束1.419 MiB含撤销历史中共享节点的去重 payload;不含容器、公共基底和引擎对象。
网格 / Chaos / 地形专用显存尚未独立归属不按整个 UE 进程的内存反推地形占用。
展开单个网格任务的内存计算
单个 Level 6 任务数组内容容量
四层原始读取(40³ + 14³ + 10³ + 8³) × 2 B133.31 KiB
预处理样本40³ × 2 B125.00 KiB
过滤后的密度36³ × 4 B182.25 KiB
过滤临时整数和36 × 36 × 38 × 4 B192.38 KiB
辅助场40³ × 1 B62.50 KiB
网格单元索引缓存36³ × 2 B91.12 KiB

过滤时,上表前四项同时存在,逻辑内容合计 632.94 KiB;进入网格阶段后,过滤临时数组释放,辅助场与索引缓存生效,固定内容合计 594.19 KiB。顶点、四边形、簇、打包输出和 UE 副本另加,不能将这些固定数组当作任务总内存。

若 16 个 Level 6 任务同时处在过滤阶段,仅这部分固定数组为 9.890 MiB。这是容量计算,不是实测峰值或总内存上限。CPU 中间顶点为 52 B / 顶点,原格式打包为 12 B / 顶点;UE 解码、Section、渲染缓冲与碰撞会各自占用内存,不能用 12 B 估算整条链。

下一轮需要补齐独立的读取、过滤、预整理和 Chaos 工作计时,以及分阶段分配追踪与地形 GPU 隔离。当前表格不会将这些缺失项记为零,也不会用安装后的等待时间代替碰撞耗时。

下载本轮数据 JSON ↓UE 5.7.4 历史测量

进阶参考:数据结构、表面算法与 UE 调度

前面的五步说明因果关系。以下 13 节保留代码层面的精确定义、工程参数、二维交互和已有验证记录;需要深入实现时可按主题查阅。

01

系统分层与数据依赖

地形密度是可编辑的权威数据。可见网格和碰撞由密度派生;水体保留独立状态,通过变化通知更新地形障碍。

密度数据与派生系统系统关系示意;连接表示依赖,不表示同步执行。
权威数据地形快照 · 密度 / 材料 / 版本
生成依赖表面网格采样 → 过滤 → 顶点 / 索引
生成依赖Chaos 碰撞三角形 → 异步烹饪 → 发布
状态交互局部水体变化范围 → 障碍重采样
输入
相同世界坐标、密度快照和变化版本
处理
各系统独立生成与调度
输出
网格、碰撞及水体障碍分别更新

实现边界 烟雾尚未接入。后续可消费相同变化通知,但模拟状态、求解网格和时间步需要独立设计。

02

采样编码与层级组织

自然地形使用 16 位采样字,保存材料类别与固体占据量。存储样本与表面三角形属于不同层次的数据。

16 位自然地形采样字位序从高到低;此图解释自然地形编码,不表示文件字节序。

高 8 位 · 占据量

低 8 位 · 材料类别

逻辑数据层与 8³ 样本块层级与切片为组织示意。块内为合成样例;实际节点另有压缩和共享。
8 × 8 切片
最细采样间距
25 cm
最细层逻辑容量
256³ 个样本
完全铺开该层
32 MiB

实现边界 32 MiB 仅为最细逻辑层的 16 位数据量,不包含父层、快照、网格、碰撞与分配开销。材料类别 ≥128 的建筑几何有独立解释规则。

03

不可变快照与写时复制

后台网格任务读取固定快照。编辑产生新世界状态,未修改节点继续共享,受影响节点在写入时复制。

编辑前后的节点归属仅展开三个逻辑节点;父层复制与压缩节点的物理布局未展开。
后台任务 · 快照 Vₙ
当前世界 · Vₙ
输入
Vₙ 快照与修改范围
处理
复制待写节点、补齐父层、递增版本
输出
世界切换到 Vₙ₊₁;旧任务继续读取 Vₙ

实现边界 任务完成后仍需检查版本有效性。快照隔离保证读取一致,不意味着过时网格可以发布。

04

初始地形的构形与量化

生成器先构造山坡和洞穴的三维标量场,再量化为占据量。运行时编辑修改量化后的数据,不重新生成整座山体。

初始场的四个处理阶段二维构形示意,展示布尔组合关系,不复现地图截面的全部参数。
高度轮廓、岩台合并、洞穴相减与占据量量化
输入
高斯轮廓、Perlin 噪声、岩台、胶囊通道及椭球洞室
处理
高度扩展为三维场 → min 合并 → max 相减 → 量化
输出
材料 86 的占据量样本;更新父层并保存基底缓存

实现边界 负值表示固体、正值表示空气。组合形式接近 SDF,但叠加高度与噪声后不再处处是精确距离。修改公式时须同步更新 SourceVersion。

UE 5.8.3 独立包中的山谷与洞穴
UE 5.8.3 实际运行画面。截图来自升级功能验证,设有 120 FPS 上限;不用于性能验收。
05

局部编辑范围与材料工作量

一次编辑先确定笔刷作用域,再准备对齐的立方体缓冲。Remove 内核按距离分组,从中心向外消耗本次工作量。

作用域与编辑缓冲的区别合成坐标代入 PrepareEditRegion;图为 XY 投影。立方体边长取三轴覆盖范围最大值。
笔刷范围、8 对齐范围与立方体编辑缓冲
输入 Low / High
(11,18,9) / (21,26,14)
缓冲 Minimum
(8,16,8)
缓冲 Size
16 × 16 × 16
按距离分组的工作量分配五组为合成输入,初始占据量均为 255。此图解释材料工作量,不表示 CPU 或 GPU 时间。
中心 → 外缘比例 0.0005 · 初始预算 1
输入
18 m 射线命中、法线、0.5~2.5 m 半径
处理
挖掘中心内移 0.3R → 对齐读取 → 距离分组扣量 → 清理 → 写回
输出
修改后的局部采样、父层与变化通知

实现边界 普通连续操作间隔为 0.12 秒。0.0005 是当前工程手感参数,不是已确认的原作材料值。填土使用 Add;整平使用水平 Flatten。孤立样本清理不等于刚体坍塌。

挖掘前岩壁
编辑前:连续的岩壁表面。
挖掘后岩壁
编辑后:表面与碰撞来自新密度。自动输入半径为 1.8 m,HUD 默认值不代表自动笔刷。
06

单元交点与表面顶点

自然地形采用 Surface Nets 风格的单元顶点方法。边穿过零值时产生交点,交点均值给出该单元的代表顶点。

调整角点密度并观察顶点移动二维对应模型为 4 角、4 边;三维使用 8 角、12 边。虚线为均值辅助线,不是最终三角形。
角点、零值边交点及平均顶点
● 角点○ 零值交点◆ 代表顶点
  1. 01读取与过滤自定义 3³ 邻域过滤
  2. 02边交点插值在异号角点之间线性插值
  3. 03单元代表顶点平均全部有效交点
  4. 04连接表面相邻单元连接四边形,再拆为三角形

实现边界 过滤组合中心值、邻域均值和极值,不是简单的 27 点平均;顶点求解未采用 QEF。法线由密度变化估计。

07

邻域窗口与多层网格

网格任务不能只读取核心区域。密度过滤、法线与边界处理需要邻域数据;LOD 改变采样尺度及覆盖范围。

32 / 36 / 40 采样窗口同一节点的二维截面;长度按 32:36:40 绘制。
核心、密度与原始读取的嵌套窗口
显示层级与空间覆盖固定空间范围下的采样密度示意。直接选择层级,不模拟原作相机阈值。
输入
相机选择的节点与固定快照
处理
四次源读取 → 密度窗口过滤 → 核心表面生成
输出
MeshNode 接受 Level 4~6;最细核心边长约 8 m

实现边界 最高布局四次读取涉及 Level 6、4、3、2。边界顶点沿法线收缩,但混合 LOD 接缝尚未彻底解决;当前扩大近景细节范围以缓解。

08

异步任务与发布状态

数据、网格和碰撞可以处于不同版本。新资源完成前保留旧节点;版本有效且碰撞就绪后,按节点切换可见资源。

沿更新链检查各系统状态横向为逻辑阶段,不表示相同时间间隔;文字与颜色共同标识状态。
后台网格任务上限
16 个
主线程安装限流
0.35 ms 软预算
单帧安装次数
最多 2 次
空闲组件保留目标
最多 32 个
输入
带范围与版本的变化通知
处理
快照读取 → Section 预整理 → 组件复用 → 异步 Chaos 烹饪
输出
版本检查后发布;过时结果丢弃并重新排队

实现边界 软预算在下一次安装开始前检查,单次安装不能抢占,仍可能超时。0.35 ms 不是实测总耗时。节点并非同时原子切换,烹饪中组件可能使池规模暂时超过保留目标。

09

完整编辑链交互验证

剖面将密度修改、网格准备、碰撞就绪与发布分开,用于检查“数据已改变、旧表面仍保留”的中间状态。

输入
点击剖面定位,或展开键盘定位控件
处理
执行挖掘 / 填土,逐步推进更新
输出
对照采样点、待发布边界与已发布表面

实现边界 该图使用简化的二维占据量编辑,不执行三维材料工作量内核。点数、手动步进时间和撤销速度不能用于估算 UE 性能。

10

地形变化与水体障碍更新

水体保存独立的分层水柱与体积状态。地形提供脏范围和新版本,水体在地形稳定后重采样受影响的障碍。

比较地形与水体障碍的版本显示可通行拓扑及变化列,不计算流量、波面或真实更新时间。
地形孔洞与水体障碍重采样的版本关系
输入
相同坐标、TerrainDensityRevision 与变化范围
处理
地形忙时沿用旧障碍;稳定后重采样相关水柱
输出
新的可通行关系参与后续水流求解

实现边界 持续编辑可能推迟障碍刷新。土塞是真实密度几何,不是隐藏脚本开关;当前实现不等同于 Fluid Flux 或 FluidNinja。

11

快照撤销与 VDR2 存档

撤销回到已有地形快照,存档持久化压缩后的完整地形状态。两者均不以可见三角形作为主要状态来源。

选择历史快照并恢复地形最多 16 份地形快照;索引及版本为合成演示。
地形数据V16
派生资源当前网格 / 碰撞
水状态保持独立
VDR2 的逻辑组成及写入顺序按职责分组,不代表精确字节偏移或字段比例。
标识与版本VDR · v2
来源与定位SourceCRC / Anchor
世界序列Sequence / Size
压缩世界状态Data.SaveState()
文件校验CRC
  1. 01写入临时文件完整状态及校验信息
  2. 02完成写入保留原目标文件
  3. 03替换目标将临时文件移动为正式存档

实现边界 当前 Undo 使全部网格失效,取回快照后的重建成本不能省略。F5 / F9 与 Undo 只处理地形,不保存或回退水状态。不同地图使用独立 profile;基底缓存与玩家存档分离。

12

预算参数与验证证据

参数约束、功能通过和性能达标属于不同证据。下图标明结论的适用范围,避免将配置值作为实测开销。

当前证据与待验收项每个小标记对应一项已通过自动检查;不代表测试耗时。
代码参数0.35 ms 软预算 · 16 个任务 · 2 次 / 帧用于限流;不构成帧率结论
功能验证68 项自动检查通过 · 七组运行检查完成
UE 5.8.3 迁移与运行功能验证
实际测量UE 5.8.3 · 1080p 四阶段基础地图离屏采样;逐步开销与未测项分别列出查看本轮性能 →UE 5.7.4 历史记录 →
目标验收120 Hz · 单帧约 8.33 ms完整光照、玩法与物理负载尚未共同验收
  1. 01数据与生成减负高度复用、空块跳过、基底缓存、节点共享
  2. 02局部与后台处理局部编辑、相机 LOD、异步过滤及网格准备
  3. 03主线程发布减负组件复用、分帧安装、异步碰撞、过时任务淘汰

实现边界 动态地形为 CPU 网格生成,不是 Nanite 地形。Lumen、正式植被、烟雾、角色和完整物理负载尚未同时验收,功能验证不能证明完整游戏达到 120 Hz。

13

模块职责与源码索引

模块按数据流拆分。每组文件对应明确职责,参数及文件校验值可在公开快照中核对。

从构形到发布的代码职责图文件位于 Source/VoxelDig。此图为职责视图,不是类继承关系。
01地图生成TerrainStudy.cpp · TerrainStudyWorld.cpp

Height / Density / CreateStudy;构形、量化与基底缓存。

02输入与世界编辑DigGame.cpp · DigTerrain.cpp · VoxelOriginalWorld.cpp

射线、工具、快照、版本与存档。

03编辑内核OriginalTerrainRegion.h · OriginalTerrainEdit.h

局部缓冲与 Remove / Add / Flatten。

04采样与表面OriginalTerrainWorker.h · OriginalTerrainKernels.h

邻域读取、DensityGrid、Cell 与 FullCell。

05UE 调度与发布DigOriginalScheduler.cpp · DigMeshComponent.cpp

任务、Section 预整理、组件池与 Chaos 烹饪。

06水体交互WaterStudy.cpp

密度版本、变化范围及水柱障碍重采样。

实现边界 本文仅陈述现行代码与已有记录可确认的行为。工程含逆向后对齐的部分内核,也含独立实现的地图、材质、UE 接入与水流,不据此宣称完整复现原作算法或性能。