# nova **Repository Path**: jackson_woohoo/nova ## Basic Information - **Project Name**: nova - **Description**: mmo 服务器框架 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-07 - **Last Updated**: 2026-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Nova — 基于 ECS 的 MMO 服务器框架 > 语言标准:C++20 | 构建系统:CMake | 目标平台:Linux / Windows / macOS Nova 是一个**通用 MMO 服务器框架**,以 Entity-Component-System 为核心数据与逻辑范式,上层按职责分层,每层可独立水平扩展。采用渐进式演进路线,从单进程小规模起步,逐步扩展到分布式大规模部署。 --- ## ✨ 核心特性 | 特性 | 说明 | |------|------| | **Archetype SoA 存储** | 相同 Component 组合的 Entity 连续存储,遍历时缓存命中率极高 | | **Query 引擎** | 声明式 Include/Exclude 过滤器,支持链式调用 | | **System 调度** | 按 Priority 排序的 tick 链式执行,支持依赖拓扑排序 | | **零开销 Tag Component** | 纯标记(如 `PlayerTag`、`DeadTag`)不占存储空间 | | **EventBus 事件总线** | 类型安全的发布/订阅,内置组件变更事件 | | **WorldSnapshot 快照** | 状态快照的捕获/恢复/序列化/反序列化,支持断线重连 | | **WorldManager 多实例** | 多 World 管理,每个地图/副本一个独立 World | | **插件系统** | C++ 动态库(.so/.dll)运行时加载,Kahn 拓扑排序确定执行顺序 | | **Lua 脚本层** | 基于 sol2 的 Lua 绑定,支持运行时热加载游戏逻辑 | | **网络层** | libuv TCP 服务端,自定义帧协议(Magic + Len + MsgId + Payload) | | **存储层** | 可插拔后端(Memory / Redis / MySQL),LRU 本地缓存 + 脏标记自动保存 | | **Gateway 网关** | 连接管理、请求路由、服务注册与发现 | | **集群** | Gossip 节点发现、跨服 Entity 迁移 | | **运维** | HTTP 管理接口、结构化日志、Prometheus 指标 | --- ## 🏗️ 模块架构 ``` nova/ ├── nova_ecs/ # ECS 核心(Entity / Component / Archetype / World / System / Query) ├── nova_net/ # 网络层(TCP Server / Connection / Frame Codec / RPC) ├── nova_core/ # 基础设施(YAML 配置 / 线程池 / 日志 / 指标 / 插件加载器) ├── nova_storage/ # 存储层(Document / IStorageBackend / LRU Cache / EntityRepository) ├── nova_gateway/ # 网关层(Gateway Service / Request Router / Session) ├── nova_admin/ # 管理层(HTTP Admin Server / 路由) ├── nova_cluster/ # 集群层(Gossip 协议 / Entity 迁移) ├── nova_protos/ # Protobuf 定义(可选) ├── nova_script/ # Lua 脚本层(sol2 绑定,可选) ├── plugins/ # 内置插件(Combat / AI / Loot / Chat) ├── examples/ # 示例程序(Echo Server / MMO Demo) ├── scripts/ # Lua 脚本示例 ├── tests/ # 单元测试 + 基准测试 └── docs/ # 设计文档 + 分阶段实施计划 ``` ### 模块依赖关系 ``` nova_ecs (独立模块,无外部依赖) nova_core → yaml-cpp, nova_ecs nova_net → libuv nova_storage → nova_ecs nova_script → nova_ecs, sol2, Lua 5.4 nova_gateway → nova_ecs, nova_net nova_admin → nova_ecs, nova_net nova_cluster → nova_ecs, nova_net plugins/ → nova_ecs(共享库,运行时加载) ``` --- ## 🚀 构建 **环境要求**:CMake 3.20+,C++20 编译器(MSVC 2022 / GCC 12+ / Clang 15+) ```bash # 配置 mkdir build && cd build cmake .. -G "Visual Studio 17 2022" -A x64 # Windows cmake .. # Linux / macOS # 构建 cmake --build . --config Release # 运行测试 ctest --output-on-failure -C Release # 运行基准测试(10万实体,1000帧,目标 <5ms/帧) tests/Release/nova_ecs_bench ``` ### 可选功能 ```bash cmake .. -DNOVA_ENABLE_PROTOBUF=ON # 启用 Protobuf(需安装 protobuf) cmake .. -DNOVA_ENABLE_REDIS=ON # 启用 Redis 后端(需安装 hiredis) cmake .. -DNOVA_ENABLE_MYSQL=ON # 启用 MySQL 后端(需安装 mysql-client) cmake .. -DNOVA_ENABLE_SCRIPTING=ON # 启用 Lua 脚本层(自动拉取 sol2,需 Lua 5.4) ``` 依赖通过 CMake FetchContent 自动拉取:Google Test v1.14.0、libuv v1.48.0、yaml-cpp、sol2 v3.5.0。 --- ## 📖 快速开始 ### C++ ECS ```cpp #include #include struct Position { float x, y, z; }; struct Velocity { float x, y, z; }; class MoveSystem : public nova::ISystem { void onRegister(nova::World&) override {} void tick(nova::Duration dt) override { float s = dt.seconds(); world()->eachArchetypeContaining( [s](nova::Archetype& arch) { for (size_t i = 0; i < arch.size(); ++i) { auto& pos = arch.getComponent(i); auto& vel = arch.getComponent(i); pos.x += vel.x * s; pos.y += vel.y * s; } }); } }; int main() { nova::World world; world.registerSystem(); auto e = world.createEntity(); world.addComponent(e, Position{0, 0, 0}); world.addComponent(e, Velocity{10, 0, 0}); world.tick(nova::Duration::fromSeconds(1.0f)); // Position 现在是 (10, 0, 0) } ``` ### Lua 脚本 ```lua -- 创建实体并添加组件 local e = world:createEntity() world:setPosition(e, 10.0, 20.0, 30.0) world:addComponent(e, "PlayerTag") -- 读取组件 local pos = world:getPosition(e) print("位置:", pos.x, pos.y, pos.z) -- 修改组件 world:setCombatHP(e, 80) -- 注册 Lua tick 系统 function lua_movement_system(dt) -- 每帧游戏逻辑 end ``` --- ## 📊 性能基准 10 万实体(Position + Velocity + Health),1000 帧: ``` 平均 tick 耗时: < 5 ms 目标: 20Hz = 50ms/tick ``` --- ## 📁 API 概览 ### Entity 生命周期 ```cpp auto e = world.createEntity(); // 创建 world.alive(e); // 是否存活 world.destroyEntity(e); // 销毁 ``` ### Component 操作 ```cpp world.addComponent(e, Position{1, 2, 3}); // 添加 world.getComponent(e); // 获取引用 world.hasComponent(e); // 检查 world.removeComponent(e); // 移除 ``` ### Query 查询 ```cpp world.query() // 包含 .exclude() // 排除 .each([](Position& pos, Velocity& vel) { // 遍历 // ... }); ``` ### EventBus 事件 ```cpp world.eventBus().subscribe([](const DamageEvent& e) { // 处理伤害事件 }); world.eventBus().emit(DamageEvent{source, target, 100}); ``` --- ## 📈 项目进度 | 阶段 | 内容 | 状态 | |------|------|------| | Phase 1 | ECS 核心(Entity / Component / Archetype / World / Query / System) | ✅ 已完成 | | Phase 2 | 网络层(TCP Server / 帧协议 / RPC) | ✅ 已完成 | | Phase 3 | 插件系统 + EventBus + YAML 配置 | ✅ 已完成 | | Phase 4 | 存储层(Document / IStorageBackend / LRU / EntityRepository) | ✅ 已完成 | | Phase 5 | Gateway + RPC + 多线程 | ✅ 已完成 | | Phase 6 | 集群 + 运维(Gossip / HTTP Admin / 日志 / 指标) | ✅ 已完成 | | Phase 7 | 示例游戏 + 工具链(Combat / AI / Loot / Chat 插件 + MMO Demo) | ✅ 已完成 | | 扩展 | Lua 脚本层(sol2 绑定 + 15 个游戏组件类型) | ✅ 已完成 | --- ## 📜 许可证 MIT License