15 KiB
游戏引擎实施计划(基于审查报告的落地版)
本计划以“通用高性能 Rust 游戏引擎(不内置业务逻辑)”为目标,整合当前仓库中已有的 DDD / 事件系统文档结论,并补齐审查中暴露的工程化阻塞项(workspace 构建基线、测试失败、安全与 unsafe 风险、async 边界混乱、基准与剖析缺口等)。
文档信息
- 版本:2.0
- 创建/更新日期:2025-12-17
- 适用范围:本仓库 workspace + game_engine 主 crate + 相关子 crate(game_engine_simd / game_engine_hardware / game_engine_performance)
输入与证据来源(必须全部覆盖)
本实施计划覆盖以下已存在文档/结论(不替代其细节,但将其转化为可执行任务与验收标准):
- 执行摘要:executive_summary.md
- 既有 DDD 改进计划与 TODO:implementation_plan.md(本文件旧版内容)与 detailed_todo_list.md
- 领域事件系统:domain_events_system_design.md 与 event_system_implementation_plan.md
- 事件溯源:event_sourcing_architecture.md、event_sourcing_improvement_plan.md、event_sourcing_implementation_summary.md
- 进度/状态摘要:current_progress_summary.md(其中“已完成/待完成”需要与代码现实核对)
- 审查中发现的工程阻塞与风险(来自代码与构建结果):
- workspace 未包含 game_engine crate;导致无法统一测试/基准与依赖继承不一致
- game_engine manifest 使用 tracing.workspace=true,但 workspace.dependencies 未定义 tracing
- game_engine 依赖的 path(game_engine_simd / hardware / performance)在当前目录结构下无效
- game_engine_performance crate 测试编译失败(类型不匹配、错误调用 unwrap 等)
- game_engine_simd 存在 unreachable/unused 等 warning
- core/engine/initialization.rs 使用 unsafe transmute 延长窗口引用生命周期
- network/key_exchange.rs 使用 SHA256 模拟 ECDH(不具备密码学安全性)
- 多处 Handle::current().block_on / block_on 混用,存在运行时嵌套与阻塞风险
- monitoring_legacy 等“legacy/重复实现”与备份文件(engine.rs.backup)清理需求
总体目标与非目标
总体目标
- 可验证基线:workspace 可构建、可测试、可基准、可剖析。
- 安全与健壮性:消除高风险 unsafe 与伪加密,建立可审计边界。
- 性能工程化:有代表性的 benchmark/负载、可观测性(tracing/metrics/profiling)与回归闸门。
- 架构收敛:DDD/事件溯源/领域事件系统按既有设计落地,并避免“引擎域”被计划/业务域污染。
非目标(本阶段不做)
- 不引入新的 UI/Editor 产品功能;仅修正架构与工程基线。
- 不做大规模“推倒重写”;优先渐进式、可回滚的改动。
路线图(P0/P1/P2)
P0:打通构建/测试基线 + 清除阻塞风险(必须先做)
里程碑 P0 完成定义:
cargo test --workspace通过cargo test -p game_engine通过(game_engine 纳入 workspace 后)cargo test -p game_engine_performance通过cargo clippy --workspace --all-targets通过(允许有少量 deny/allow 过渡,但需列出清单)- 删除/隔离高风险 unsafe transmute;网络密钥交换不再是伪实现
P0-1:Workspace 拓扑修复(阻塞项)
目标:让 game_engine 成为 workspace 一等成员,统一依赖继承与测试执行入口。
实施步骤:
- 更新根 Cargo.toml 的
[workspace].members:加入game_engine,并移除无意义的"."(若根目录无[package])。 - 在
[workspace.dependencies]增补被继承但缺失的依赖:至少tracing,并明确版本策略。 - 统一版本来源:
- 尽可能使用
*.workspace = true继承(wgpu/winit/tokio/serde 等),避免同名依赖多版本。
- 尽可能使用
- 修复 game_engine 中对 sibling crate 的 path:
game_engine_simd→../game_engine_simdgame_engine_hardware→../game_engine_hardwaregame_engine_performance→../game_engine_performance
验收标准:
cargo metadata能看到game_engine在 packages 中cargo check -p game_engine通过
P0-2:修复 game_engine_performance 的测试编译失败
目标:恢复 workspace 测试全绿,作为后续性能与回归的闸门。
实施步骤(按审查已知错误类型):
- 统一 metrics 数值类型(f32/f64)策略:
- 要么所有统计/百分位统一用 f64(更通用),要么统一用 f32(更贴近 GPU/实时)。
- 修复 frame analyzer 测试中的 API 误用:
- 若
start_frame()返回(),测试不得调用.unwrap(); - 若希望返回
Result,则修改 API 并补齐调用方。
- 若
- 补齐必要的回归测试:覆盖本次修复点。
验收标准:
cargo test -p game_engine_performance通过
P0-3:收敛 async 边界与阻塞调用(先止血)
目标:避免运行时嵌套、死锁、以及在异步上下文中阻塞导致的帧抖动。
实施步骤:
- 盘点所有
Handle::current().block_on/block_on调用点(editor/settings、profiling/storage、platform/fs、scene serialization 等)。 - 定义“同步 API 与异步 API 的边界规范”并落地:
- 同步 API 只允许在“引擎启动前/非 runtime 线程”阻塞;
- 运行中一律走 async 路径或 spawn_blocking。
- 对外暴露:
*_async()为主路径;*_sync()只作为薄包装,并检测 runtime 环境(如:在 runtime 内改为block_in_place或直接返回错误)。
验收标准:
- 关键路径(资源加载/渲染/编辑器保存)不再在 runtime 内直接
block_on - 至少提供一条文档化准则 + lint/grep 规则(脚本)
P0-4:高风险 unsafe / 安全缺陷修复
P0-4a:移除 unsafe transmute(窗口生命周期)
目标:替换 core/engine/initialization.rs 中通过 transmute 强行获取 'static window 引用的做法。
推荐改法(择一):
- 让 WgpuRenderer 持有
Arc<Window>(或 Window 所需的句柄),避免引用生命周期扩张。 - 或者让初始化函数把 renderer 生命周期约束在 window 生命周期内(不要求
'static)。
验收标准:
- initialization.rs 不再出现
std::mem::transmute - wgpu 初始化与窗口事件循环保持正确所有权/生命周期
P0-4b:替换伪 ECDH 密钥交换
目标:network/key_exchange.rs 不再使用 SHA256 模拟 ECDH。
推荐改法:
- 使用成熟实现(例如 X25519 + HKDF + transcript/hmac),并提供 feature flag:
secure_key_exchange(默认开启)insecure_key_exchange(仅用于 demo/本地,必须显式开启,且运行时打印警告)
验收标准:
- 密钥交换具备前向安全性基础(X25519)
- 单测覆盖:双方协商一致、消息格式稳定、重放/篡改失败
P0-4c:Nonce/Token 设计审计(AES-GCM/HMAC)
目标:确保 AES-GCM nonce 在同 key 下不复用;token 签名有明确版本与过期策略。
验收标准:
- nonce 生成策略明确且可测试(计数器溢出/重启场景)
- 文档化协议字段与兼容策略
P0-5:技术债清理(可维护性止血)
- 清理备份文件:engine.rs.backup(若仍需要,迁移到 docs/ 或 git 历史)。
- legacy/重复实现:
- 明确 monitoring_legacy 的去留策略(保留兼容层 or 迁移并删除)。
- 领域污染治理:
- 将 “implementation_plan” 这类非引擎域内容迁出 runtime domain 代码;保留为 docs 即可。
- 文档与现实对齐:
- 核对 current_progress_summary.md 中“已完成”的条目是否在代码中真实落地;不一致则修正文档或补做实现。
验收标准:
- 仓库内无
.backup残留 - legacy 模块要么标注弃用与迁移期限,要么已删除
- 进度文档与代码状态一致(可通过对应 PR/commit 或测试结果佐证)
P1:性能与可观测性工程化(剖析/基准可落地)
里程碑 P1 完成定义:
- 有可运行的代表性基准:渲染/资源加载/物理/网络(至少 3 类)
- 可观测性落地:tracing spans + 关键指标(帧耗时、资源队列延迟、shader 编译时间、网络 RTT 等)
- 能在本机稳定复现并对比性能(同一提交前后)
P1-1:统一 profiling / tracing / metrics 入口
- 明确使用 tracing 作为统一事件管道(log 仅做兼容)。
- 引擎关键路径添加 span:
- frame loop
- render submit
- asset load queue
- shader compile
- network tick
- 让 game_engine_performance 提供对接层,而不是重复实现。
P1-2:基准体系补齐与持续回归
- 确认 benches 归属:
- 引擎主 crate benches(已有目录):确保可运行且覆盖关键路径
- game_engine_simd:补齐 benches 或移除“bench 但无用例”的错觉
- 建立 baseline 命令集合(脚本):
cargo bench -p game_enginecargo bench -p game_engine_simd
- 性能门禁建议:
- P0 先“可跑”;P1 再加阈值(回归 <5%)
P1-3:异步资源/着色器队列性能优化(在可观测性之后)
- coroutine_loader / shader_async:
- 记录队列长度、平均等待、最大等待
- 降低 sleep/poll 造成的抖动(优先用 notify/channel)
- spawn_blocking 限额:
- 配置化并与 CPU 核数/任务类型绑定
P2:DDD/事件系统/事件溯源按既有设计落地(在 P0/P1 稳定后推进)
里程碑 P2 完成定义:
- 聚合根边界一致性与版本控制落地
- 领域事件系统类型安全、无 downcast_ref 依赖
- 事件溯源命令/存储/重放/快照/版本控制按文档落地
- 测试覆盖与回归闸门具备可执行指标
P2-1:聚合根边界与不变式(保留既有计划但补齐验收)
范围:Scene、GameEntity、RenderScene、PhysicsWorld、AudioSource。
验收标准:
- 聚合内部状态不允许绕过方法直接写入
- 不变式检查存在且有单测
P2-2:错误处理与锁安全(safe_lock 替换)
- 替换所有
.lock().unwrap()与同类 panic 路径。 - 为锁污染提供恢复策略或可诊断错误。
验收标准:
- 对应 grep 清零或只剩允许列表
P2-3:领域事件系统(按设计文档与实施计划)
来源:domain_events_system_design.md 与 event_system_implementation_plan.md。
- 类型安全事件注册(EventTypeRegistry + factory/macro)
- SafeEventBus(最小持锁、批量处理、并行分发)
- 聚合根事件集成(AggregateRoot trait + 未提交事件队列)
验收标准:
- 无 downcast_ref 事件分发
- 单测覆盖核心路径 + 并发安全测试
P2-4:事件溯源系统(按 improvement_plan 分阶段推进)
来源:event_sourcing_improvement_plan.md(内容较长,本计划以“阶段化任务+验收”落地,不复制全文)。
阶段建议:
- 命令完善(Create/Delete/Update)
- 事件存储增强(批量、分页、版本控制)
- 查询与重放(注册表集成、从快照恢复)
- 性能监控与测试套件
时间与里程碑建议(相对时间)
- T+1~2 周:完成 P0(基线全绿 + 关键安全风险清零)
- T+3~6 周:完成 P1(可观测性 + 可跑基准 + 负载/剖析落地)
- T+7~12 周:推进 P2(事件/溯源/DDD 收敛)
交付物清单
- 可运行的 workspace(统一构建/测试/bench 入口)
- 安全修复:无 transmute 生命周期扩张;无伪 ECDH
- 性能与可观测性:tracing + 指标 + benches + 回归脚本
- 架构能力:领域事件系统与事件溯源系统按设计文档落地
变更策略(避免大爆炸)
- 用 feature flag 分层切换:安全协议、事件系统、性能优化。
- 每个阶段都必须有“可回滚点”(最小 PR/最小变更)。
- 扩展性能指标收集范围
- 实现实时性能分析
- 添加性能趋势预测
- 创建性能告警机制
- 实现性能优化建议
- 添加性能报告生成
预期收益:
- 及时发现性能瓶颈
- 支持性能优化决策
- 提高系统运行效率
- 增强用户体验
负责人: 性能工程师
预估工期: 2.5周
9. 改进资源管理系统
改进名称: 异步资源加载优化
实施步骤:
- 优化资源加载队列
- 实现智能预加载机制
- 添加资源优先级管理
- 实现资源缓存策略
- 优化内存使用
- 添加资源加载监控
预期收益:
- 提高资源加载效率
- 减少加载等待时间
- 优化内存使用
- 改善用户体验
负责人: 资源管理工程师
预估工期: 2周
10. 完善测试覆盖率
改进名称: 领域层和核心系统测试
实施步骤:
- 分析当前测试覆盖率
- 识别测试盲点
- 为聚合根添加单元测试
- 实现集成测试套件
- 添加性能基准测试
- 实现自动化测试流程
预期收益:
- 提高代码质量
- 减少生产环境bug
- 支持重构和演进
- 增强系统可靠性
负责人: 测试工程师
预估工期: 3周
实施时间表
gantt
title 游戏引擎架构改进实施时间表
dateFormat YYYY-MM-DD
section 高优先级
完善聚合根实现 :p1-1, 2024-01-01, 14d
优化错误处理机制 :p1-2, after p1-1, 11d
实现领域事件系统 :p1-3, after p1-2, 21d
section 中优先级
完善事件溯源系统 :p2-1, after p1-3, 18d
实现聚合快照机制 :p2-2, after p2-1, 14d
优化性能监控系统 :p2-3, after p2-2, 18d
section 低优先级
添加聚合版本控制 :p3-1, after p2-3, 14d
实现审计日志系统 :p3-2, after p3-1, 14d
改进资源管理系统 :p3-3, after p3-2, 14d
完善测试覆盖率 :p3-4, after p3-3, 21d
风险评估与缓解策略
高风险项
-
聚合根实现改动 - 可能影响现有功能
- 缓解策略:渐进式重构,保持向后兼容
-
事件系统引入 - 可能影响系统性能
- 缓解策略:性能基准测试,优化事件处理
中风险项
-
错误处理机制改动 - 可能引入新的错误
- 缓解策略:全面测试,错误场景模拟
-
事件溯源系统 - 增加系统复杂度
- 缓解策略:详细文档,团队培训
成功指标
技术指标
- 聚合根边界一致性: 100%
- 错误处理安全性: 100%
- 测试覆盖率: >90%
- 性能回归: <5%
业务指标
- 系统稳定性: 提升30%
- 开发效率: 提升25%
- 问题诊断时间: 减少50%
- 用户体验评分: 提升20%
资源需求
人力资源
- 领域架构师: 1人
- 系统工程师: 3人
- 测试工程师: 2人
- 性能工程师: 1人
技术资源
- 开发环境: 增强版测试环境
- 监控工具: 性能分析工具
- 测试工具: 自动化测试框架
总结
本实施计划提供了一个系统性的方法来改进游戏引擎的架构设计。通过优先处理聚合根实现、错误处理和领域事件系统等关键领域,我们将建立一个更加健壮、可维护和可扩展的系统架构。实施过程中将采用渐进式方法,确保系统稳定性和业务连续性。
预期在完成所有改进后,游戏引擎将具备:
- 更清晰的领域模型边界
- 更强的错误处理和恢复能力
- 更好的系统可观测性和可维护性
- 更高的性能和用户体验
这些改进将为游戏的长期发展奠定坚实的技术基础。