CD Code Digest Hub /CS:GO

DataModel 与 DMX

4 分钟阅读 4 个章节

Source 有两套基于“元素 + 属性”的数据表示,容易混淆:

体系模块典型用户特点
DataModel(CDmElement)datamodel、dmserializers、movieobjects 等工具(粒子编辑器、材质编辑器、解说编辑器、SFM 等)完整的对象系统:元素工厂、撤销、依赖图、多种序列化格式与旧格式导入
DMX 轻量加载(CDmxElement)dmxloader运行时(粒子定义等)只做反序列化成轻量树,不依赖 DataModel

它们都与玩法的“数据库”无关;物品 schema 是另一套 KeyValues 体系(见 物品与经济)。

相关页面:模型、动画与粒子 · 内容工具链

相关源码文件#

  • datamodel/datamodel.h、datamodel/datamodel.cpp、datamodel/dmelement.cpp、datamodel/undomanager.cpp
  • dmserializers/dmserializers.cpp
  • dmxloader/dmxloader.cpp
  • particles/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 派生库只确认其存在与归属(工具侧)。