# Boo-Engine **Repository Path**: aisoloer/Boo-Engine ## Basic Information - **Project Name**: Boo-Engine - **Description**: C++ 基于 vulkan 开发的游戏引擎 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-01-31 - **Last Updated**: 2026-01-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Boo-Engine
**一个简单、灵活、高效的 Vulkan 游戏引擎** 基于 Vulkan 开发 | 跨平台支持 | 现代架构设计 ⚠️注意:整个项目还属于正在开发阶段,欢迎参与贡献和反馈问题 **作者:杨宗宝**
--- ## 项目简介 **Boo-Engine** 是一个用 C++ 开发的跨平台游戏引擎,采用高性能的 Vulkan 图形 API,支持 2D/3D 渲染。引擎设计遵循现代游戏引擎的最佳实践,提供场景管理、组件系统、事件系统、UI 框架等完整功能。 ### 作者 - **宗宝** ### 技术栈 - **渲染 API**: Vulkan - **编程语言**: C++ - **字体渲染**: FreeType - **构建系统**: CMake --- ## 核心特性 - **跨平台支持** - Windows、macOS、Linux 等多平台运行 - **现代渲染架构** - 基于 Vulkan,支持多相机、离屏渲染、实例化绘制 - **完整的场景系统** - 场景图设计,支持 2D/3D 分层 - **灵活的组件系统** - ECS 架构,轻松扩展游戏功能 - **强大的 UI 框架** - 响应式布局、自动适配、事件系统 - **事件驱动架构** - 低耦合的模块通信 - **资产异步加载** - 不阻塞主线程的资源管理 - **可视化编辑器** - 类似 Unity 的场景编辑工具 --- ## 引擎架构 Boo-Engine 采用模块化设计,各个模块职责清晰,易于理解和扩展。 ### 架构图 ``` Boo-Engine │ ├─ 引擎启动层 (Engine) │ └─ 窗口管理 + 主循环 │ ├─ 游戏核心 (Game) │ ├─ 场景管理 │ ├─ 定时器调度 │ └─ 全局状态 │ ├─ 场景系统 (Scene) │ ├─ 场景图 (Scene Graph) │ ├─ 节点树 (Node Hierarchy) │ └─ 2D/3D 节点分层 │ ├─ 组件系统 (Component) │ ├─ 相机 (Camera) │ ├─ UI 组件 (Sprite/Text/Layout) │ └─ 自定义组件 (用户扩展) │ ├─ 渲染系统 (Renderer) │ ├─ Vulkan 图形层 (GFX) │ ├─ 渲染管线 (Pipeline) │ └─ 批量渲染 (Batch Rendering) │ ├─ 输入系统 (Input) │ ├─ 鼠标 & 键盘 │ └─ UI 事件分发 │ ├─ 资产系统 (Assets) │ ├─ 纹理加载 │ ├─ 材质管理 │ └─ 异步加载 │ ├─ 事件系统 (Event) │ └─ 全局事件总线 │ └─ 编辑器 (Editor) ├─ 场景编辑器 ├─ 层级视图 └─ 属性检查器 ``` --- ## 模块功能说明 ### 1. 引擎启动层 (Engine) **作用**: 程序的入口点,负责窗口创建和主循环。 **对外接口**: ```cpp Engine::init(Window* window, Platform platform) // 初始化引擎 Engine::tick(float deltaTime) // 每帧更新 Engine::updateViewSize(width, height) // 窗口大小改变 ``` **通俗理解**: 就像游戏的"发动机",负责启动整个引擎并保持运转。 --- ### 2. 游戏核心 (Game) **作用**: 引擎的"大脑",统筹管理所有子系统。 **主要职责**: - 管理场景的创建和销毁 - 调度定时器任务 - 协调各个子系统运行 - 管理多个相机 **对外接口**: ```cpp Game::getInstance() // 获取全局实例(单例模式) Game::openScene(Scene* scene) // 打开场景 Game::destroyScene(Scene* scene) // 销毁场景 Game::schedule(callback, interval, repeat) // 定时执行任务 Game::extractCamera(Camera* camera) // 添加相机 ``` **通俗理解**: 类似游戏的"导演",负责协调演员(场景、相机)和剧本(定时任务)。 --- ### 3. 场景系统 (Scene) **作用**: 游戏世界的容器,所有游戏对象都存在于场景中。 #### 3.1 场景 (Scene) **对外接口**: ```cpp Scene::create() // 创建场景 scene->createRoot2D() // 创建 2D 根节点(用于 UI) scene->createRoot3D() // 创建 3D 根节点(用于游戏物体) scene->setActive(bool) // 激活/暂停场景 ``` **层级结构**: ``` Scene (场景根) ├─ Root3D (3D 世界) │ ├─ 游戏角色 │ ├─ 环境物体 │ └─ 灯光 └─ Root2D (2D 界面) ├─ UI 面板 ├─ 按钮 └─ 文本 ``` #### 3.2 节点 (Node) **作用**: 场景中的基本对象,可以是角色、UI 元素、灯光等。 **核心属性**: - **位置** (Position) - 对象在空间的坐标 - **旋转** (Rotation) - 对象的朝向 - **缩放** (Scale) - 对象的大小 - **父子关系** - 节点可以嵌套(如角色手上拿着武器) **对外接口**: ```cpp node->setPosition(x, y, z) // 设置位置 node->setRotation(x, y, z, w) // 设置旋转(四元数) node->setScale(x, y, z) // 设置缩放 node->addChild(childNode) // 添加子节点 node->addComponent("ComponentName") // 添加组件 ``` **通俗理解**: 场景是"舞台",节点是"道具",你可以移动、旋转、缩放道具,也可以让道具互相连接。 --- ### 4. 组件系统 (Component) **作用**: 为节点添加功能的"模块",采用组合优于继承的设计。 #### 核心理念 (ECS 架构) - **Entity** (实体) = Node (节点) - **Component** (组件) = 功能模块 - **System** (系统) = 自动调用组件的 Update **生命周期**: ```cpp Awake() // 初始化(仅一次) Enable() // 激活时 Update(dt) // 每帧更新 Disable() // 禁用时 destroy() // 销毁时 ``` #### 内置组件 | 组件名称 | 功能说明 | |---------|---------| | **Camera** | 定义视角和渲染目标 | | **UISprite** | 显示 2D 图片 | | **UIText** | 显示文本 | | **UIMask** | 实现遮罩效果(如进度条) | | **UILayoutHorizontal** | 水平自动布局 | | **UILayoutVertical** | 垂直自动布局 | | **UIWidget** | 响应式适配(屏幕大小改变时自动调整) | **对外接口**: ```cpp // 创建组件 auto sprite = node->addComponent("UISprite"); auto text = node->addComponent("UIText"); // 获取组件 auto camera = node->getComponent("Camera"); // 销毁组件 node->destroyAllComponents(); ``` **通俗理解**: 节点是"空盒子",组件是"功能插件"。你可以给盒子装上"显示图片"插件、"显示文字"插件等,随意组合。 --- ### 5. 渲染系统 (Renderer) **作用**: 将场景中的内容绘制到屏幕上。 #### 5.1 相机 (Camera) **作用**: 定义"从哪里看"和"看到什么"。 **核心功能**: ```cpp camera->setPriority(0) // 渲染优先级(数字越小越先渲染) camera->setVisibility(layerMask) // 可见层(哪些对象能被看到) camera->setIsOnScreen(true) // 是否渲染到屏幕 camera->resize(width, height) // 调整渲染区域大小 ``` **多相机支持**: - 相机 1(优先级 0):渲染 3D 世界 - 相机 2(优先级 1):渲染 2D UI **离屏渲染**: 相机可以渲染到纹理(RenderTexture),然后作为材质贴到其他对象上(如监控画面、小地图)。 #### 5.2 渲染流程 ``` 1. 遍历所有相机(按优先级) 2. 对每个相机: ├─ 设置视图矩阵和投影矩阵 ├─ 遍历场景节点树 ├─ 收集可见的渲染对象 ├─ 按材质批量提交绘制命令 └─ 执行 Vulkan 渲染 3. 交换缓冲区(显示到屏幕) ``` **通俗理解**: 相机是"摄像机",可以有多个摄像机从不同角度拍摄,最后合成一张画面。 --- ### 6. Vulkan 图形层 (GFX) **作用**: 封装 Vulkan 底层 API,提供高性能渲染能力。 #### 核心模块 | 模块 | 说明 | |------|------| | **GfxContext** | 管理 Vulkan 设备、队列、交换链 | | **GfxRenderer** | 渲染管线和命令提交 | | **GfxShader** | 顶点和片段着色器 | | **GfxTexture** | 纹理资源 | | **GfxMaterial** | 材质(纹理 + 着色器) | | **GfxMesh** | 网格(顶点 + 索引) | | **GfxPipeline** | 渲染管线状态 | | **GfxRenderTexture** | 离屏渲染目标 | **对外接口**: ```cpp // 创建纹理 GfxMgr::createTexture(uuid, width, height, channels, pixels) // 创建着色器 GfxMgr::createGlslShader(name, type, glslCode, macros) // 提交渲染对象 GfxMgr::submitRenderObject(renderId, material, mesh, instanceData) ``` **性能优化**: - **实例化绘制** - 一次绘制多个相同对象 - **批量渲染** - 合并相同材质的对象 - **Bindless 纹理** - 减少状态切换开销 **通俗理解**: Vulkan 是底层"绘画工具",GFX 层把复杂的画笔、画布操作封装成"画个圆"、"画条线"这样的简单命令。 --- ### 7. UI 框架 **作用**: 提供丰富的 UI 组件和布局系统。 #### 核心 UI 组件 **UISprite** - 图片显示 ```cpp auto sprite = node->addComponent("UISprite"); // 设置纹理、颜色等 ``` **UIText** - 文本显示 ```cpp auto text = node->addComponent("UIText"); // 设置文字内容、字体大小、颜色等 ``` **UIMask** - 遮罩效果 ```cpp auto mask = node->addComponent("UIMask"); // 实现进度条、头像裁剪等效果 ``` **UILayout** - 自动布局 ```cpp // 水平布局(按钮横向排列) auto layout = node->addComponent("UILayoutHorizontal"); // 垂直布局(列表纵向排列) auto layout = node->addComponent("UILayoutVertical"); ``` **UIWidget** - 响应式适配 ```cpp auto widget = node->addComponent("UIWidget"); widget->setHorizontal(HORIZONTAL_ALL, {}); // 水平拉伸填满 widget->setVertical(VERTICAL_TOP, {offset}); // 顶部对齐 ``` **适配模式**: - **LEFT/RIGHT** - 左/右对齐 - **TOP/BOTTOM** - 上/下对齐 - **CENTER** - 居中 - **ALL** - 拉伸填满 **通俗理解**: UI 框架提供"按钮"、"文本框"、"进度条"等现成的零件,还能自动排版,适配不同屏幕大小。 --- ### 8. 输入系统 (Input) **作用**: 处理鼠标、键盘输入,并分发到 UI 节点。 **对外接口**: ```cpp // 注册节点输入事件 Input::onNodeInputEvent(node, INPUT_MOUSE_DOWN, [](NodeInputValue value) { // 处理点击事件 }); // 移除输入监听 Input::offNodeInputEvent(inputID); ``` **输入事件类型**: - `INPUT_MOUSE_DOWN` - 鼠标按下 - `INPUT_MOUSE_UP` - 鼠标抬起 - `INPUT_MOUSE_MOVE` - 鼠标移动 - `INPUT_MOUSE_ENTER` - 鼠标进入节点 - `INPUT_MOUSE_LEAVE` - 鼠标离开节点 **事件传播机制**: 从场景根节点开始向下传播,最深的节点优先处理(类似 HTML DOM 事件)。 **通俗理解**: 当你点击屏幕时,输入系统会找到"被点击的按钮",然后通知它"你被点击了"。 --- ### 9. 资产系统 (Assets) **作用**: 管理游戏资源(纹理、材质、网格、场景等)。 **对外接口**: ```cpp AssetsManager::getInstance()->loadAsset(uuid) // 加载资源 AssetsManager::getInstance()->getAsset(uuid) // 获取资源 AssetsManager::getInstance()->setAssetsRoot(path) // 设置资源根目录 ``` **资产类型**: - **TextureAsset** - 图像资源(PNG/JPG 等) - **MaterialAsset** - 材质资源 - **ShaderAsset** - 着色器资源 - **MeshAsset** - 网格资源 - **SceneAsset** - 场景资源 **异步加载**: 资源加载不会阻塞主线程,加载完成后通过回调通知。 **通俗理解**: 资产系统是"仓库管理员",你需要图片、音乐、模型时,告诉它,它会去仓库找出来给你。 --- ### 10. 事件系统 (Event) **作用**: 全局事件总线,实现模块间解耦通信。 **对外接口**: ```cpp // 监听事件 Event::on("event_name", [](EventValue value) { // 处理事件 }, this); // 触发事件 Event::emit("event_name", 123); // 值可以是 string/int/float/bool // 移除监听 Event::off(listenerId); Event::offTarget(this); // 移除实例的所有监听 ``` **应用场景**: - 游戏逻辑事件(如角色死亡、关卡完成) - UI 事件(如按钮点击、对话框关闭) - 系统事件(如资源加载完成、场景切换) **通俗理解**: 事件系统是"广播电台",一个模块可以"发布消息",其他模块可以"订阅频道"来接收消息。 --- ### 11. 字体系统 (Font) **作用**: 使用 FreeType 将文本渲染成纹理。 **对外接口**: ```cpp FreetypeMgr::crateFont(textTexture, str, fontSize, lineHeight) FreetypeMgr::clearFont(key) ``` **工作流程**: 1. 加载字体文件(.ttf) 2. 解析文本字符串 3. 生成纹理位图 4. 返回纹理数据供 UIText 使用 **通俗理解**: 字体系统把"文字"变成"图片",这样就能用渲染引擎显示文字了。 --- ### 12. 数学库 (Math) **作用**: 提供 3D 数学运算支持。 **数学类型**: - **Vec3** - 3D 向量(位置、方向) - **Vec2** - 2D 向量(UI 坐标) - **Mat4** - 4x4 矩阵(变换) - **Quat** - 四元数(旋转) - **Color** - 颜色(RGBA) - **Size** - 大小(宽高) **对外接口**: ```cpp Vec3 position(1.0f, 2.0f, 3.0f); position.add(Vec3(1, 0, 0)); // 向量加法 float length = position.len(); // 向量长度 Mat4 transform; transform.translate(1, 2, 3); // 平移 transform.scale(2, 2, 2); // 缩放 ``` **通俗理解**: 数学库提供"计算器",帮你算物体的位置、角度、距离等。 --- ### 13. 编辑器 (Editor) **作用**: 可视化编辑工具,类似 Unity Editor。 **核心功能**: - **场景编辑器** - 可视化编辑场景 - **层级视图** - 树状显示节点结构 - **属性检查器** - 编辑节点和组件属性 - **资源浏览器** - 管理项目资源 - **游戏预览** - 实时预览游戏效果 **工作流程**: 1. 在编辑器中创建场景 2. 添加节点和组件 3. 调整属性 4. 保存场景文件 5. 运行时加载场景 **通俗理解**: 编辑器是"可视化工作台",不用写代码就能拖拽创建游戏界面和场景。 --- ## 使用示例 ### 创建一个简单场景 ```cpp // 1. 创建场景 auto scene = Scene::create(); Game::getInstance()->openScene(scene); // 2. 创建 UI 根节点 auto root2D = scene->createRoot2D(); // 3. 创建一个精灵节点 auto spriteNode = Node2D::create(); spriteNode->setPosition(0, 0, 0); spriteNode->setSize(100, 100); root2D->addChild(spriteNode); // 4. 添加精灵组件 auto sprite = spriteNode->addComponent("UISprite"); // 设置纹理和属性... // 5. 注册点击事件 Input::onNodeInputEvent(spriteNode, INPUT_MOUSE_DOWN, [](NodeInputValue value) { std::cout << "Sprite clicked!" << std::endl; }); ``` ### 使用定时器 ```cpp // 每 1 秒执行一次,重复 5 次 Game::getInstance()->schedule([]() { std::cout << "Hello every second!" << std::endl; }, 1.0f, 5); // 5 秒后执行一次 Game::getInstance()->scheduleOnce([]() { std::cout << "Hello after 5 seconds!" << std::endl; }, 5.0f); ``` ### 使用事件系统 ```cpp // 监听事件 Event::on("player_died", [](EventValue value) { int score = std::get(value); std::cout << "Game Over! Score: " << score << std::endl; }, this); // 触发事件 Event::emit("player_died", 12345); // 移除监听 Event::offTarget(this); ``` --- ## 程序启动流程 ``` 1. main() 函数启动 ↓ 2. 创建窗口 (Window) ↓ 3. Engine::init() ├─ Game::init() │ ├─ Vulkan 初始化 (GFX) │ ├─ 输入系统初始化 (Input) │ ├─ 事件系统初始化 (Event) │ ├─ 字体系统初始化 (Font) │ ├─ 资产系统初始化 (Assets) │ └─ 加载启动画面 (Alpha Scene) ↓ 4. 游戏主循环 └─ while (running) ├─ 处理输入事件 ├─ 更新所有节点和组件 ├─ 渲染场景 └─ 交换缓冲区(显示画面) ``` --- ## 每帧渲染流程 ``` 1. 遍历所有相机(按优先级排序) ↓ 2. 对每个相机: ├─ 设置视图矩阵和投影矩阵 ├─ 遍历场景节点树 ├─ 筛选可见节点 ├─ 收集渲染对象(Material + Mesh) ├─ 按材质批量提交到 Vulkan └─ 执行绘制命令 ↓ 3. 交换缓冲区,显示到屏幕 ``` --- ## 设计特点 ### 优点 1. **模块化设计** - 各模块职责清晰,易于维护 2. **ECS 架构** - 灵活的组件系统,易于扩展 3. **事件驱动** - 模块间解耦,降低依赖 4. **多相机支持** - 可实现复杂的渲染效果(小地图、镜子反射等) 5. **异步资源加载** - 不阻塞主线程,流畅体验 6. **响应式 UI** - 自动适配不同屏幕尺寸 7. **高性能渲染** - 实例化绘制、批量渲染、Bindless 纹理 ### 关键优化 - **批量渲染** - 合并相同材质的对象,减少绘制调用 - **实例化绘制** - 一次绘制多个相同对象 - **离屏渲染** - 支持后处理、中间纹理 - **推送常量** - 快速传递小量数据到着色器 --- ## 项目结构 ``` Boo-Engine/ ├─ engine/ # 引擎核心代码 │ ├─ engine.h # 引擎入口 │ └─ core/ │ ├─ game.h # 游戏核心 │ ├─ scene/ # 场景系统 │ ├─ component/ # 组件系统 │ ├─ renderer/ # 渲染器 │ ├─ gfx/ # Vulkan 图形层 │ ├─ input/ # 输入系统 │ ├─ assets/ # 资产系统 │ ├─ event/ # 事件系统 │ ├─ font/ # 字体系统 │ └─ math/ # 数学库 │ ├─ editor/ # 编辑器 │ └─ core/ │ ├─ main/ # 编辑器主界面 │ ├─ cache/ # 编辑器缓存 │ └─ config/ # 编辑器配置 │ ├─ examples/ # 示例项目 ├─ assets/ # 资源文件 └─ CMakeLists.txt # 构建配置 ``` --- ## 快速开始 ### 构建项目 ```bash # 克隆仓库 git clone cd Boo-Engine # 创建构建目录 mkdir build && cd build # 配置 CMake cmake .. # 编译 cmake --build . # 运行示例 ./examples/example_project ``` ### 系统要求 - **编译器**: 支持 C++17 的编译器(GCC 7+, Clang 5+, MSVC 2019+) - **Vulkan SDK**: 1.2 或更高版本 - **CMake**: 3.15 或更高版本 --- ## 相关文档 - **引擎架构详解**: 参见 `docs/architecture.md`(如果有) - **API 参考**: 参见各模块头文件中的注释 - **示例项目**: 参见 `examples/` 目录 --- ## 开发路线图 - [ ] 物理系统集成 - [ ] 音频系统 - [ ] 粒子系统 - [ ] 动画系统 - [ ] 网络系统 - [ ] 脚本系统(Lua/Python) - [ ] 更多示例项目 --- ## 许可证 (请根据实际情况填写许可证信息) --- ## 联系方式 - **作者**: 宗宝 - **项目地址**: (如有 GitHub/Gitee 仓库请填写) --- **Boo-Engine** - 让游戏开发更简单!