中EN
概念页

世界分区

World Partition

世界分区 (World Partition) 是 UE5 的自动数据管理与基于距离的关卡流送 (Level Streaming) 系统:整个世界存为一个持久关卡,按可配置的运行时网格划分为单元格 (Cell),由流送源 (Streaming Source,默认是玩家控制器) 按距离加载/卸载。它配合一 Actor 一文件 (One File Per Actor, OFPA) 支持多人协作编辑,用数据层 (Data Layers) 按玩法状态切换内容,用分层细节层次 (Hierarchical Level of Detail, HLOD) 在远处以代理网格显示未加载的单元格。

为什么要它

过去做大地图要手动把关卡切成子关卡,再用关卡流送按玩家位置加载;这会导致多人共享文件冲突,也难以在上下文中查看整个世界。World Partition 用单一持久关卡 + 自动网格单元格取代手动子关卡。(World Partition)

运行时流送模型

下图表示运行时的决策:每个单元格是否加载,取决于它与各流送源的距离是否在网格的加载范围内;未加载单元格在远处由 HLOD 代理显示;运行时数据层再对其中的 Actor 做开关。

flowchart TB
  SS["流送源<br/>PlayerController / Streaming Source 组件"] --> Q{"单元格在 Loading Range 内?"}
  Q -- "是" --> L["加载单元格中的 Actor"]
  Q -- "否" --> H["显示该区域的 HLOD 代理网格"]
  L --> D{"Actor 所属运行时数据层状态"}
  D -- Activated --> V["加载且可见"]
  D -- Loaded --> NV["加载但不可见"]
  D -- Unloaded --> X["不加载"]

图中流程从上到下依次是“空间筛选 → 远景替代 → 玩法层筛选”。(World Partition、World Partition - Data Layers、World Partition - HLOD)

运行时网格(World Settings 中)主要参数:Cell Size(官方示例 256 m)、Loading Range(示例半径 768 m)、Block on Slow Streaming(单元格加载跟不上时阻塞)、Priority。默认提供一个 2D Runtime Hash 网格,多于一个网格可能损害性能;推荐设置可参考 City Sample 的 Big City 地图。(World Partition)

流送源:每个 PlayerController 默认是流送源;还可以用 World Partition Streaming Source 组件在任意位置加载,官方例子是传送——先在目的地激活流送源,单元格加载完(Is Streaming Completed)再传送,然后关闭它,原位置的单元格随之卸载。组件可指定目标网格、目标 HLOD 层、形状、优先级,以及目标状态 Loaded/Activated(多源相交时取最高)。(World Partition)

Actor 设置:Is Spatially Loaded 开启时 Actor 随流送源范围加载;关闭则(只要所属数据层未禁用)始终加载,适合环境背景、管理器。引用其他 Actor 的 Actor 会被打包在一起同时加载。(World Partition)

这本质上是把世界按均匀网格做空间划分,再以“到观察者的距离”做加载判定,可与 空间数据结构 中的均匀网格、剔除技术 中的距离剔除对照理解;渲染层面的大场景技术见 大场景渲染与虚拟纹理。

编辑器侧:OFPA 与区域加载

  • 一 Actor 一文件 (OFPA):每个 Actor 存成独立文件,修改 Actor 不必签出关卡文件,减少团队冲突。(World Partition)
  • 打开大世界时默认整体未加载,只加载非空间加载的 Actor;在 World Partition 编辑器窗口框选区域加载,或放置 Location Volume 定义可重复加载的区域。生成小地图 (Minimap) 需开启虚拟纹理支持。(World Partition)
  • 已有关卡可用 Tools > Convert Level 或 WorldPartitionConvertCommandlet 转换。(World Partition)
  • 坑:关卡蓝图 (Level Blueprint) 中引用的 Actor 会被标记为始终加载 (Always Loaded),因此官方更推荐用蓝图类。(World Partition)

数据层 (Data Layers)

数据层替代旧的 Layers 系统,分为项目级的数据层资产 (Data Layer Asset)(名称、类型、调试色)和世界级的数据层实例 (Data Layer Instance)——同一资产可以在不同世界有不同实例属性。(World Partition - Data Layers)

类型用途
编辑器数据层 (Editor)组织内容:美术可只看环境、不碰玩法触发器
运行时数据层 (Runtime)用蓝图/C++ 切换状态驱动玩法:任务、进度、活动、关卡转换(如《古代山谷》的光明/黑暗世界)

运行时状态有 Unloaded、Loaded(加载但不可见)、Activated(加载且可见),通过 UDataLayerSubsystem::SetDataLayerInstanceRuntimeState 设置。官方示例代码注明:客户端-服务器模式下只有服务器能激活数据层(用 HasAuthority() 判断,见 网络复制与 RPC)。(World Partition - Data Layers)

性能警告:一次通过数据层加载过多资产会有性能问题;被大量运行时数据层实例共用的资产会降低流送性能,需密切监控。数据层的标签与 ID 存在 WorldDataLayer 文件中,改名只改标签、删层只改该文件,不必重存 Actor。(World Partition - Data Layers)

HLOD:未加载区域的远景

远处不可交互的山、树、悬崖在单元格卸载后仍需可见。World Partition 的 HLOD 用 HLOD 层 (HLOD Layer) 资产组织静态网格 Actor,生成单个代理网格与材质,用于显示未加载单元格、减少每帧绘制调用 (Draw Call)、提升性能。(World Partition - HLOD)

层类型做法适用
Instancing替换为实例化静态网格 (ISM),使用各资产最低 LOD树木、植被等 Imposter 类
Merged Mesh合并为一个代理网格(可合并材质)建筑群
Simplified Mesh合并后再做网格简化(可用 Merge Distance 封闭门窗等缝隙)远景大体量结构

Actor 需设为静态 (Static) 并分配到 HLOD 层(Actor 细节面板、数据层的默认 HLOD 层或 World Settings 默认层),再用 Build HLODs 或 WorldPartitionHLODsBuilder 构建;源 Actor 未变化时不会重建。HLOD 层可设置父层形成层级,也可设为始终加载。调试可用 wp.Runtime.HLOD 0 关闭 HLOD 显示。(World Partition - HLOD、World Partition)

HLOD 是 细节层次 思想在“多个对象合并”层面的推广:单个网格的 LOD 减少三角形,HLOD 再把许多对象合并以减少绘制调用。

取舍与常见坑

问题说明
网格参数Cell 太小→单元格多、调度开销大;Loading Range 太小→近处出现空洞或频繁阻塞
多网格官方提示多于一个运行时网格可能损害性能
关卡蓝图引用被引用 Actor 变为始终加载
数据层滥用资产被过多运行时数据层共用会拖慢流送
传送/快速移动先用流送源组件预加载目标区域
HLOD 过期修改源网格/材质后需重新构建
多人运行时数据层仅服务器可激活

调试命令:wp.Runtime.ToggleDrawRuntimeHash2D/3D(显示网格与加载状态)、wp.Runtime.OverrideRuntimeSpatialHashLoadingRange、wp.Runtime.MaxLoadingLevelStreamingCells(限制并发加载单元格数)、wp.DumpDatalayers 等。(World Partition、World Partition - Data Layers)关卡之外的单个资产按需加载见 资产管理与异步加载;大规模人群等实体模拟可结合 MassEntity 数据导向框架。

GEA 的视角:世界块与编辑器图层(卷 II 16.1.2、16.4.1)

  • 为什么分块:GEA 认为除最小的游戏外都要把世界分成"世界块",理由是内存限制、控制游戏流程和分工;开放世界只是营造"无缝"的假象,并用 LOD 降低内存和提升性能(卷 II 16.1.2)。世界分区把这种划分自动化为运行时网格,HLOD 对应 GEA 说的 LOD 手段(这是对比归纳)。
  • 按层存取避免冲突:GEA 指出,如果编辑器能单独加载和保存图层(灯光一层、背景几何一层、AI 角色一层),多个团队就能同时编辑同一世界块而不冲突(卷 II 16.4.1.5)。本页的 OFPA 用"每个 Actor 一个文件"在更细的粒度上解决同一问题;编辑器数据层则对应 GEA 说的"隐藏无关元素、减少杂乱"的图层用途(这是对比归纳)。
  • 目标与块松耦合:GEA 主张玩家目标与世界块之间保持松耦合,以便独立修改(卷 II 16.1.3);运行时数据层按任务、进度切换内容,是把目标状态映射到世界内容的一种方式(这是对比归纳)。

详见 游戏世界与游戏对象 和 数据驱动与游戏世界编辑器。

GEA 第 17 章的补充:从气闸到细粒度流送(卷 II 17.4.1–17.4.3)

GEA 第 17 章描述了世界流送的演进,可作为本页的背景,详见 游戏世界的加载与流送:

  • 一次一关、栈分配器(常驻资源在栈底);再到气闸:不等分的一大一小两块内存,玩家在狭小、无法回头的气闸区域里时卸载旧区域、加载新区域(《光环》《杰克 2》)。
  • 粗粒度流送要求所有块大致等大;细粒度流送把所有资产切成等大的块,用块式池分配器按需加载卸载,避免碎片(《最后生还者》引擎)。
  • Naughty Dog 用设计者放置的凸体关卡加载区域决定加载什么:取包围玩家的所有区域的块列表并集,与内存中的块比较后增删;区域的布置保证玩家看不到块消失,并有足够时间流送。

与本页对照:世界分区用网格单元和流送源的加载范围自动决定加载哪些单元格,不需要手工放置加载区域;"Block on Slow Streaming"选项对应 GEA 强调的"开始加载到可见之间要有足够时间"这一约束失败时的兜底(对比归纳)。PS4/PS5 的 PlayGo 边玩边下载,也以无缝流送为前提。

  1. World Partition UE 5.8 文档
  2. World Partition - Data Layers UE 5.8 文档
  3. World Partition - HLOD UE 5.8 文档
  4. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  5. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 16 章 16.1.2、16.4.1 节
  6. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 17 章 17.4.1–17.4.3 节

相关页面

游戏开发 · UE5资产管理与异步加载Asset Management & Async LoadingUE 资产默认按引用自动加载:硬引用 (Hard Reference) 会让被引用资产随引用者一起加载,不加控制就可能在启动时加载全部内容。软引用 (Soft Reference,TSoftObjectPtr/FSoftObjectPath) 只存路径,配合流式管理器 (Streamable Manager) 异步按需加载;资产管理器 (Asset Manager) 进一步把内容划分为主资产 (Primary Asset) 和次资产 (Secondary Asset),用资产包 (Asset Bundle) 管理加载、卸载、烘焙分块与内存审计。图形学细节层次Level of Detail细节层次 (LOD) 在物体对图像贡献变小时改用更简单的表示。LOD 系统由三部分组成:生成(简化或手工制作多个版本)、选择(按距离、投影面积等收益函数挑选)、切换(尽量减少跳变 popping)。LOD 主要减少顶点处理,也通过减少 quad 过度着色降低像素开销;进一步还可在预算约束下全局选择 LOD,实现时间关键(恒定帧率)渲染。图形学大场景渲染与虚拟纹理Large Scenes & Virtual Texturing当场景数据远大于内存(如主机只有 8 GB,而游戏世界有数百 GB)时,需要按需把数据流送进内存。本页讲三类技术:虚拟纹理(把巨大的 mipmap 链切成瓦片,只让可见瓦片驻留在显存,通过页表/间接纹理寻址)、纹理转码(磁盘上用高压缩比的可变码率格式,加载时转成 GPU 块压缩格式),以及按平面瓦片组织资产的通用流送。这些方法几乎总是与剔除和 LOD 配合使用;地形部分见 地形渲染。图形学剔除技术Culling Techniques剔除 (culling) 是在渲染前尽快去掉对最终图像没有贡献的部分。本页讲几何类剔除:背面剔除(含成簇背面剔除与法线锥)、视锥剔除(层次化、平面掩码)、室内场景的入口剔除,以及牺牲质量换速度的细节剔除和小三角形剔除。更复杂的遮挡剔除见 遮挡剔除。图形学空间数据结构Spatial Data Structures空间数据结构把几何体按 n 维空间组织起来,通常是层次化的树,使"几何体是否重叠"一类查询从 O(n) 降到大约 O(\log n)。常见类型有包围体层次 (BVH)、BSP 树(轴对齐的 k-d 树与多边形对齐两种)、四叉树/八叉树(含松散八叉树),以及更偏向组织模型关系的场景图。它们是剔除、光线求交、碰撞检测等加速算法的基础。游戏开发 · UE5网络复制与 RPCNetwork Replication & RPCUE 采用服务器权威 (Server-Authoritative) 的客户端-服务器模型:游戏真正在服务器上进行,服务器把状态复制 (Replication) 给客户端,客户端通过远程过程调用 (Remote Procedure Call, RPC) 向服务器请求操作。开发者需要显式声明哪些 Actor、属性、函数要走网络,并借助所有权、网络角色、相关性、优先级控制“发给谁、发多少”。UE 5.8 提供通用复制系统、Replication Graph 和实验性的 Iris 三套复制系统。游戏开发 · UE5MassEntity 数据导向框架MassEntity FrameworkMassEntity 是 UE5 面向玩法的数据导向 (Data-Oriented) 计算框架,属于实体-组件-系统 (Entity Component System, ECS) 一类设计:实体 (Entity) 只是一个 ID 加上一组片段 (Fragment) 数据,相同组成的实体归入同一原型 (Archetype) 并按内存块 (Chunk) 连续存放,无状态的处理器 (Processor) 通过实体查询 (EntityQuery) 批量处理片段。它适合成千上万个同质对象(人群、交通),MassGameplay 插件在其上提供表现、生成、LOD、复制、StateTree 等功能。游戏开发 · UE5Lumen 全局光照与反射Lumen Global Illumination & ReflectionsLumen 是 UE5 默认的全动态全局光照 (Global Illumination, GI) 与反射系统:先做屏幕空间追踪,未命中再对"Lumen 场景"做软件光追(有符号距离场)或硬件光追,命中点的光照从按网格离线放置的卡片 (Card) 构成的表面缓存 (Surface Cache) 中查询,表面缓存的直接与间接光照分摊到多帧更新,从而得到无限次漫反射弹射和全粗糙度范围的反射。游戏开发 · UE5Nanite 虚拟化几何体Nanite Virtualized GeometryNanite 是 UE5 的虚拟化几何体 (Virtualized Geometry) 系统:导入时把网格切成分层的三角形簇 (Cluster),渲染时按相机视角逐簇选择细节层次并无缝拼接,按需从磁盘流送,并在绕过传统绘制调用 (Draw Call) 的独立通道中渲染,使帧预算不再受多边形数、绘制调用和网格内存约束。游戏开发 · UE5AI 感知、EQS 与导航AI Perception, EQS & NavigationAI 的感官层由三块组成:AI 感知 (AI Perception) 组件挂在 AIController 上监听视觉/听觉/伤害等刺激并更新黑板;环境查询系统 (EQS) 用生成器产生候选项、先过滤后打分,回答「哪里最好」;导航系统从碰撞几何生成分瓦片的导航网格 (NavMesh),按多边形代价寻路,并提供 RVO 与 Detour Crowd 避让。它们为行为树/StateTree 提供输入。游戏开发 · UE5PCG 程序化内容生成框架PCG FrameworkPCG 框架把程序化内容表达为「点流」:PCG 组件/体积从关卡采样空间数据,图中的 Sampler 生成带变换、密度、种子与自定义属性的点,经过滤与变换后由 Spawner 生成网格或 Actor,编辑器中实时更新,也可运行时生成。属性分为 $ 静态属性和元数据动态属性,按 @Data/@Points/@Elements 域组织;图参数与图实例的用法类似材质参数与材质实例;与世界分区集成,生成物继承数据层与 HLOD 层。游戏开发 · UE5Game Features 与模块化玩法Game Features & Modular GameplayGame Features 与 Modular Gameplay 两个插件让开发者把一个玩法功能做成独立的插件,可以单独启用或停用。功能本身由一个 GameFeatureData 资产里的 Action 列表描述,最常用的是 Add Components:把插件里的组件按需挂到已有的 Actor 类上。这样主工程的代码保持干净,无关功能之间不会意外产生依赖,对需要长期增减功能的线上产品尤其重要。游戏开发 · UE5复制图Replication Graph复制图 (Replication Graph) 插件解决的是服务器 CPU 瓶颈:标准做法是让每个复制 Actor 对每个连接各自判断是否需要发送,玩家和 Actor 一多(Fortnite 大逃杀开局有 100 名玩家、约 5 万个复制 Actor)就撑不住。复制图由持久存在的节点组成,按空间网格、休眠、常驻相关等规则预先分组,并缓存可跨帧、跨连接共享的复制列表。游戏开发 · UE5水体系统Water SystemUE5 的 Water 插件用样条 (Spline) 定义海洋、湖泊、河流和自定义水体,它们会自动通过 Landscape 笔刷在地形上挖出河床和湖底。所有水体共用由 Water Zone 生成的同一套瓦片网格,因此相互衔接无缝。网格 LOD 每帧遍历四叉树生成,相邻 LOD 之间平滑变形过渡,远处用一块远景网格填补到地平线。游戏开发 · UE5地形系统LandscapeUE5 的 Landscape 把地形切成大小相同的正方形组件 (Component),组件是渲染、可见性计算和碰撞的基本单位;每个组件可以再分成 1 个或 2×2 个分段 (Section),分段是 LOD 计算的基本单位。分段的顶点数必须是 2 的幂(最大 256×256),这样不同 LOD 可以存进高度纹理的 mipmap。地形材质用 Landscape Layer Blend 节点按权重图混合多个图层。游戏开发空间分区Spatial Partition空间分区 (Spatial Partition) 把对象按位置存进空间数据结构,使“找出某位置附近的对象”这类查询不必遍历所有对象,把 O(n) 或 O(n^2) 的操作降下来。最简单的是固定网格;还可以选层次结构(四叉树、BSP、k-d 树、BVH),以及边界固定或随对象自适应的划分方式。代价是对象移动时要更新结构,并且要额外占用内存。游戏开发引擎文件系统与异步文件读写Engine File System & Asynchronous File IO资源管理器大量依赖文件系统。引擎通常把操作系统的文件 API 包装成自己的 API:一是跨平台、屏蔽硬件差异;二是操作系统缺少引擎需要的功能(如流式加载),主机还要统一访问记忆棒、硬盘、蓝光盘、网络文件系统等介质。引擎文件系统 API 通常涵盖:文件名与路径操作、打开/关闭/读写文件、扫描目录、处理异步 I/O 请求(流式加载)。游戏开发游戏世界与游戏对象Game World & Game Objects游戏由玩法 (gameplay) 而不是技术定义;游戏机制 (game mechanics) 是支配游戏中各实体交互的规则,以及目标、成败标准、玩家能力、非玩家实体和整体流程(GEA 引用的论文称实现玩法的软件系统为游戏的 G 因子)。大多数游戏世界由静态元素和动态元素组成,划分为若干世界块,并由高层游戏流程组织玩家目标;动态元素通常实现为游戏对象 (GO),引擎提供的建模设施称为游戏对象模型,且分为工具侧和运行时两套(GEA4 卷 II 16、16.1–16.2)。游戏开发数据驱动与游戏世界编辑器Data-Driven Engines & Game World Editors当游戏行为可以部分或全部由美术和策划提供的数据控制,而不只由程序员写的代码控制时,引擎就是数据驱动的。它能提高团队效率、缩短迭代时间,但工具、健壮的运行时和预览手段都要花大量成本,过度设计反而降低生产力,所以要权衡并坚持 KISS。玩法领域里对应 DCC 工具的是游戏世界编辑器:创建世界块并放入静态和动态元素、设定对象初始状态和行为。GEA 列出了它的典型功能,并比较了不同引擎在何时做平台相关优化上的取舍(GEA4 卷 II 16.3–16.4)。游戏开发游戏世界的加载与流送Loading & Streaming Game Worlds世界加载系统负责两件事:把世界块和所需资源从磁盘读进内存的文件 I/O,以及这些资源的内存分配与释放;另外还要管理游戏对象的生成与销毁。GEA 按演进顺序介绍:一次只载一个关卡的栈式加载(LSR 资源压栈底),用小块气闸 (air lock) 区域实现基本无缝的过渡,再到把所有资产切成等大块、用块池分配器按关卡加载区域流送的细粒度方案(Naughty Dog);对象生成的内存问题有"不许运行时分配"、按尺寸分池、小内存分配器和内存重定位四种对策;存档则分检查点和随处存档(GEA4 卷 II 17.4)。游戏策划游戏空间与关卡架构Game Space & Level Architecture第 12 章的功能空间只是骨架,本章讨论玩家实际体验到的有血有肉的空间。建筑的首要目的是控制人的体验,因此建筑师与游戏设计师是近亲:都造人要进入才能使用的结构,都只能靠间接控制引导体验,所造之物都只为让人快乐。内容包括五种空间组织方式、地标、Christopher Alexander 的"无名特质"与生命结构十五性质、虚拟建筑的特殊性(尺度、第三人称畸变),以及"关卡设计就是细节层面的游戏设计"(第 3 版第 21 章 Worlds Contain Spaces;第 1 版为第 19 章)。综合游戏编程模式选型:解耦与性能Choosing Game Programming Patterns本页把《Game Programming Patterns》里的 19 个模式放到同一张取舍图上:大多数模式要么为了解耦(降低改代码时需要装进脑子里的知识量),要么为了性能(利用对数据和硬件的具体假设),而这两个目标经常互相拉扯。下面先讲全书的定位和 Nystrom 的架构观,再给出按问题选模式的路线和与 UE 的对照。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原