配置管理
目录
简介
本文件系统性梳理 Cataclysm-DDA 的配置管理系统,覆盖选项系统架构(配置项定义、默认值处理、运行时修改)、缓存选项系统(性能优化与传播机制)、区域设置管理(本地化、时区与货币格式化)、配置文件读写与验证、错误处理策略,以及面向扩展开发者的配置新增与迁移方案。
项目结构
配置管理相关代码主要分布在以下模块:
- 选项系统与UI:options.h/.cpp
- 运行时缓存选项:cached_options.h/.cpp
- 区域设置与地图生成参数:regional_settings.h/.cpp
- 语言与系统区域:system_locale.cpp
- JSON加载与缓存:json_loader.cpp、flexbuffer_cache.cpp
- 世界选项加载:worldfactory.cpp
图表来源
- src/options.cpp
- src/cached_options.h
- src/regional_settings.cpp
- src/system_locale.cpp
- src/json_loader.cpp
- src/flexbuffer_cache.cpp
- src/worldfactory.cpp
章节来源
- src/options.h
- src/options.cpp
核心组件
- 选项管理器 options_manager:集中注册、组织、序列化/反序列化选项;维护页面与分组;提供运行时修改接口;支持前置条件与隐藏规则。
- 选项类型 cOpt:封装单个配置项的类型、取值、默认值、UI显示文本、可选值列表、范围与步进等。
- 缓存选项 cached_options:将高频访问的布尔/整数/浮点选项复制到全局变量,避免每次查找字符串键的开销。
- 区域设置 regional_settings:按区域聚合地图生成、天气、地貌、道路、河流、湖泊、海洋等参数,支持覆盖与校验。
- 系统区域 SystemLocale:提供语言、度量单位、时间格式等系统级偏好查询。
- JSON加载与缓存:统一从路径解析JSON,使用flexbuffer缓存提升加载性能。
章节来源
- src/options.h
- src/options.cpp
- src/cached_options.h
- src/cached_options.cpp
- src/regional_settings.h
- src/system_locale.cpp
架构总览
选项系统采用“声明式注册 + 页面/分组组织 + 运行时修改 + 缓存访问”的分层设计。初始化阶段通过 add_options_* 系列函数注册所有选项,随后在UI中按页展示;运行时通过 cOpt 的 setValue 等方法修改当前值;高频读取通过 cached_options 直接访问,减少哈希查找成本;区域设置与系统区域为配置提供上下文环境。
图表来源
- src/options.h
- src/options.cpp
- src/cached_options.h
- src/regional_settings.h
详细组件分析
选项系统架构与生命周期
- 初始化:options_manager::init 清空旧状态,调用 add_options_* 注册通用、界面、图形、世界默认、调试、Android 等页面。
- 页面与分组:Page/Group 结构用于在UI中组织选项;支持空行与分组头;支持移除重复空行以优化显示。
- 选项注册:提供多种 add 重载,分别对应 bool/string_select/string_input/int/int_map/float 等类型;自动设置默认值与范围;支持隐藏规则(如平台/构建特性)。
- 值修改:cOpt::setValue/setNext/setPrev 支持运行时修改;对字符串输入会截断至最大长度;对数值类型进行边界检查并回退到默认值。
- 序列化:options_manager::serialize/deserialize 将选项容器写入/读取 JSON;支持外部选项(add_external)与世界选项(worldfactory 加载)。
图表来源
- src/options.cpp
- src/options.cpp
- src/options.cpp
章节来源
- src/options.cpp
- src/options.cpp
- src/options.cpp
缓存选项系统(性能优化与传播)
- 设计目标:将频繁读取的选项复制到全局变量,避免每次通过字符串键查找。
- 更新机制:options_manager 提供 update_options_cache 静态方法,遍历已注册选项,将当前值同步到 cached_options 中的全局变量。
- 影响范围:游戏主循环或渲染前调用该方法,确保缓存与当前选项一致;典型场景包括渲染、日志、鼠标行为等高频分支判断。
图表来源
- src/options.cpp
- src/cached_options.h
- src/cached_options.cpp
章节来源
- src/options.cpp
- src/cached_options.h
- src/cached_options.cpp
区域设置管理(本地化、时区与货币格式化)
- 数据模型:regional_settings 聚合城市布局、森林地形、河流/湖泊/海洋/峡谷、高速公路、连接关系、地面覆盖等;支持按区域覆盖(overlay)。
- 加载流程:load_region_settings 解析 JSON,填充 regional_settings;load_region_overlay 对指定区域应用覆盖;check_region_settings 校验权重有效性。
- 使用场景:地图生成、天气模拟、地貌分布等;通过 get_option 访问相关布尔/数值选项控制具体行为。
图表来源
- src/regional_settings.cpp
- src/regional_settings.cpp
- src/regional_settings.cpp
章节来源
- src/regional_settings.h
- src/regional_settings.cpp
- src/regional_settings.cpp
- src/regional_settings.cpp
系统区域与本地化
- 语言选择:options_manager::get_lang_options 提供可用语言列表,结合系统区域偏好(SystemLocale::UseMetricSystem)设置默认单位。
- 语言切换:setlocale 全局设置 C/C++ 本地化,确保数字/货币/日期等格式符合目标语言环境。
- 度量单位:根据系统区域返回值动态设置温度、速度、质量、体积、距离等单位的默认值。
章节来源
- src/options.cpp
- src/system_locale.cpp
- src/options.cpp
配置文件读写与验证
- JSON加载:json_loader.cpp 统一从路径解析 JSON,使用 flexbuffer_cache.cpp 缓存解析结果,避免重复解析。
- 配置写入:options_manager::serialize/deserialize 将选项容器序列化为 JSON;save() 调用序列化后写盘。
- 错误处理:解析失败抛出异常;校验不合法权重/覆盖区域时报错;调试信息输出帮助定位问题。
章节来源
- src/json_loader.cpp
- src/flexbuffer_cache.cpp
- src/options.cpp
- src/options.cpp
世界选项加载与迁移
- 世界选项:worldfactory.cpp 提供 load_world_option,批量启用某些选项作为世界默认。
- 外部选项:load_external_option 支持从 JSON 动态添加外部选项并赋值,兼容迁移场景。
- 选项迁移:options_manager 提供 migrateOptionName/migrateOptionValue 机制,映射旧名称与旧值到新名称/值。
章节来源
- src/worldfactory.cpp
- src/options.cpp
依赖关系分析
- options_manager 依赖 cached_options(更新缓存)、regional_settings(读取区域参数)、system_locale(语言/单位偏好)。
- JSON加载链路:json_loader.cpp -> flexbuffer_cache.cpp -> 业务模块(选项/区域设置)。
- 世界工厂依赖 options_manager 获取/设置选项。
图表来源
- src/options.cpp
- src/json_loader.cpp
- src/flexbuffer_cache.cpp
- src/worldfactory.cpp
章节来源
- src/options.cpp
- src/json_loader.cpp
- src/flexbuffer_cache.cpp
- src/worldfactory.cpp
性能考量
- 缓存访问:高频读取通过 cached_options 直接访问全局变量,避免哈希查找与字符串比较。
- JSON缓存:flexbuffer_cache 将解析后的 JSON 结果缓存到磁盘,按修改时间与偏移快速命中,显著降低启动与切换配置的延迟。
- 选项更新批处理:集中调用 update_options_cache,在关键帧或切换场景一次性同步,避免分散更新带来的重复计算。
- UI渲染优化:页面/分组结构在初始化时整理,移除重复空行,减少渲染负担。
故障排查指南
- 选项未生效:确认是否调用了 update_options_cache;检查前置条件 checkPrerequisite 是否满足;核对隐藏规则(平台/构建特性)。
- 语言/单位异常:检查 SystemLocale 返回值与 USE_LANG 选项;确认 setlocale 设置成功。
- 区域设置无效:检查 load_region_settings/apply_region_overlay 是否正确执行;使用 check_region_settings 定位权重问题。
- JSON加载失败:查看 json_loader/flexbuffer_cache 抛出的错误;确认文件存在且格式正确;检查缓存目录权限。
- 世界选项未加载:确认 worldfactory 的 load_world_option 调用路径;检查 JSON 中 options 数组是否为空。
章节来源
- src/options.cpp
- src/options.cpp
- src/regional_settings.cpp
- src/json_loader.cpp
- src/flexbuffer_cache.cpp
- src/worldfactory.cpp
结论
CDDA 的配置系统以 options_manager 为核心,结合页面/分组组织、类型安全的 cOpt、运行时修改与缓存访问,形成高可维护、高性能的配置生态。区域设置与系统区域为复杂玩法提供上下文支持。通过 JSON 缓存与集中更新策略,系统在功能丰富的同时保持良好的性能表现。
附录:配置扩展开发指南
- 新增选项
- 在 add_options_* 中注册:根据类型选择对应的 add 重载;设置默认值、范围/步进、UI 文本与提示。
- 可选:设置隐藏规则(如平台/构建特性);设置前置条件(依赖其他选项的值)。
- 参考路径:src/options.cpp
- 运行时修改
- 通过 get_options().get_option(name).setValue(...) 修改;必要时调用 update_options_cache 同步缓存。
- 参考路径:src/options.cpp, src/options.cpp
- 世界默认选项
- 在 worldfactory 中使用 load_world_option 批量启用;或通过外部选项机制 add_external + load_external_option 注入。
- 参考路径:src/worldfactory.cpp
- 配置文件格式
- 选项序列化为 JSON;区域设置/覆盖为独立对象;外部选项支持 float/int/bool 类型。
- 参考路径:src/options.cpp, src/regional_settings.cpp
- 配置迁移
- 使用 migrateOptionName/migrateOptionValue 映射旧名/旧值;外部选项支持 stub 模式避免覆盖已有设置。
- 参考路径:src/options.cpp, src/worldfactory.cpp
- 性能与验证
- 使用 cached_options 减少热点读取;利用 flexbuffer_cache 与 JSON 缓存;在加载后调用 check_* 校验数据有效性。
- 参考路径:src/cached_options.h, src/json_loader.cpp, src/regional_settings.cpp