DataModel 与 DMX
Source 有两套基于“元素 + 属性”的数据表示,容易混淆:
| 体系 | 模块 | 典型用户 | 特点 |
|---|---|---|---|
DataModel(CDmElement) | datamodel、dmserializers、movieobjects 等 | 工具(粒子编辑器、材质编辑器、解说编辑器、SFM 等) | 完整的对象系统:元素工厂、撤销、依赖图、多种序列化格式与旧格式导入 |
DMX 轻量加载(CDmxElement) | dmxloader | 运行时(粒子定义等) | 只做反序列化成轻量树,不依赖 DataModel |
它们都与玩法的“数据库”无关;物品 schema 是另一套 KeyValues 体系(见 物品与经济)。
相关源码文件#
datamodel/datamodel.h、datamodel/datamodel.cpp、datamodel/dmelement.cpp、datamodel/undomanager.cppdmserializers/dmserializers.cppdmxloader/dmxloader.cppparticles/particles.cpp
1. DataModel#
CDataModel是一个 AppSystem(CBaseAppSystem<IDataModel>):datamodel/datamodel.h:184。- 元素创建、序列化/反序列化、保存到文件、注册序列化器的入口:
datamodel/datamodel.cpp:2224-2229、datamodel/datamodel.cpp:965、datamodel/datamodel.cpp:1137、datamodel/datamodel.cpp:803、datamodel/datamodel.cpp:644。 dmserializers在Connect阶段安装所有 DME 元素工厂,在Init阶段安装非 DMX 导入器(ActBusy、解说、VMT、VMF、MKS、TEX)与 SFM v1–v9 旧格式导入器以及格式升级器:dmserializers/dmserializers.cpp:3027-3031、dmserializers/dmserializers.cpp:3051-3080。
谁在用? 本次检索中,g_pDataModel 的使用集中在 tools/(commedit、pet、vmt、toolutils),未在 engine、game/client、game/server、launcher 中出现;启动器只在 -tools/-p4 时加载 p4lib,其模块表中也没有 datamodel:launcher/launcher.cpp:727-770、launcher/launcher.cpp:812-823。这表明 DataModel 是工具侧系统(推断)。
2. 运行时的 DMX 读取#
dmxloader 提供 UnserializeDMX/SerializeDMX,可从缓冲区或文件读取文本/二进制 DMX 为 CDmxElement 树:dmxloader/dmxloader.cpp:745、dmxloader/dmxloader.cpp:775、dmxloader/dmxloader.cpp:614-631。粒子系统用它读取 DmeParticleSystemDefinition:particles/particles.cpp:3957-3970。
约束与边界#
- 未展开 DataModel 的属性类型系统、元素引用/句柄、撤销栈与剪贴板。
movieobjects、materialobjects、mdlobjects等 DME 派生库只确认其存在与归属(工具侧)。