[UE学习笔记][基于源码] 运行时网格 PMC / DMC / RMC
基于 UE 5.7 引擎源码
理清 UProceduralMeshComponent / UDynamicMeshComponent / URealtimeMeshComponent 三者的定位、数据结构、能力对比,回答"运行时构造 / 修改 mesh 该选谁"。
选型
- PMC :低频构造、万级以下顶点的程序化 mesh、Debug 可视化、原型;不适合大顶点量或高频更新(API 强制整段重传
TArray<FVector>+ 单顶点 152 B + 无 LOD / Nanite / GPUScene) - DMC :需要拓扑算法的几何编辑(CSG / Remesh / Sculpt / UV 重算等);拓扑不变时配合
FastNotifyPositionsUpdated/FastNotifyTriangleVerticesUpdated也可做高频属性更新。不适合大量独立 actor 各持一份(每实例都背一套邻接 + Overlay,内存吃紧;无 LOD / Nanite / GPUScene) - RMC :高频生成 / 更新的大体量 mesh(体素地形 / Marching Cubes / 城市 Tile / 动态海洋等);不做几何拓扑编辑------
RealtimeMeshAlgo只提供渲染数据辅助算法(切线、polygon group 重排),需要 CSG / Remesh / Sculpt 先用 DMC 算几何再喂 RMC
横向对比
表中
+= 支持,-= 不支持,++= 该组件的招牌强项。
| 维度 | PMC | DMC | RMC |
|---|---|---|---|
| 来源 | 引擎 | 引擎 | 第三方 |
| 支持版本 | UE4+ | UE5+ | UE5+ |
| 数据结构 | AoS | 索引+邻接 | SoA + Section |
| 局部更新 | - | + | ++ |
| LOD | - | - | + |
| Nanite | - | - | + |
| GPUScene 友好 | - | - | + |
| 多线程构建 | - | + | + |
| Async Collision Cooking | + | + | + |
| 几何算法 | - | ++ | - |
| 生产可用 | - | + | + |
细节
PMC
- 数据结构 :
FProcMeshVertexAoS 排布------每个顶点含双精度位置 + 法线 + 4 通道 UV + 颜色 + 切线
DMC
- 数据结构 :
FDynamicMesh3= 索引网格(顶点 / 三角形数组)+ 完整邻接表(每顶点边一环 + 每边双侧三角形)+ 法线 / UV / Color 各自 Overlay;邻接结构使拓扑算法 O(degree) 而非 O(N) - 局部更新 :拓扑变化用
NotifyMeshUpdated(重建 RenderProxy);属性变化用FastNotifyColorsUpdated/FastNotifyPositionsUpdated/FastNotifyUVsUpdated/FastNotifyTriangleVerticesUpdated(指定三角形子集),更新现有 RenderProxy buffer 而不重建 - 几何算法 :
GeometryProcessing模块群(含MeshModelingTools等)提供 CSG(布尔)/ Remesh / Sculpt / UV Layout / 简化 / 切割等拓扑级算法,配EditMesh(Lambda)调用
RMC
- 数据结构 :4 层
RealtimeMesh -> LOD -> SectionGroup -> Section。Stream 挂在 SectionGroup 上(SoA,每条对应一段 RHI 顶点缓冲),Section 只引用 SectionGroup 内 Stream 的下标范围 -> 同一份缓冲可被多 Section 切片复用 - 局部更新 :以 SectionGroup 为单位
UpdateSectionGroup(Key, NewStreamSet)整组 streams 替换;多 SectionGroup 共存使 chunked 更新天然成立(地形 chunk / Tile = 1 个 SectionGroup,互不影响) - Nanite :通过
IRealtimeMeshNaniteSceneProxyManager(Modular Feature,名RealtimeMeshNanite)接入。开源版只有接口和FRealtimeMeshNaniteResources(封装Nanite::FResources),实际实现走 Premium 模块