Mineworld 是一个使用 C++20 开发的多人在线体素游戏实验项目
- 支持本地游戏、远程游戏、无窗口客户端和专用服务器
- 基于 16×16×16 区块的体素世界、基础地形生成和多人同步
- 基于 EnTT 的玩家、机器人和物理实体
- 基于 bgfx、GLFW 和 ImGui 的渲染及界面
- 基于 Asio、UDP 和 KCP 的可靠网络通信
- 使用 FlatBuffers 序列化握手、输入、命令、聊天、实体和区块数据
- 游戏内聊天与调试命令、统一输入历史,以及专用服务器和无窗口客户端的命令行入口
- 集成 Tracy 性能分析
项目使用 C++20、CMake、Ninja 和 vcpkg,并已在 MSVC 下测试通过
已加入 Windows / Linux 分支,Linux 分支尚未构建或运行验证
cmake --build build --config Debug可执行文件和运行配置生成到 bin/
修改头文件或类布局后,如果编译链接成功,但出现崩溃/输入无反应等疑难问题,尝试编译时增加参数 --clean-first
测试统一由 mineworld_tests 目标构建,并使用 GoogleTest 注册独立用例,CTest 可以单独筛选用例并报告具体断言位置
cmake -S . -B build -DMINEWORLD_BUILD_TESTS=ON
cmake --build build --config Debug
ctest --test-dir build --output-on-failure启动客户端:
bin/mineworld.exe [client]启动专用服务器:
bin/mineworld.exe server
bin/mineworld.exe server --port 40001启动无窗口客户端,默认直接连接服务器,也可以使用内置服务器:
bin/mineworld.exe headless-client
bin/mineworld.exe headless-client --address 127.0.0.1 --port 40000
bin/mineworld.exe headless-client --integrated-server
bin/mineworld.exe headless-client --integrated-server --port 40001- 无
- 事件系统
- 输入系统
- Lua,Sol2,协程
- Handle资源管理系统热加载(音乐,音效,材质,贴图集,着色器,脚本)
- actor增量同步
- 区域Region概念
- 实体查询
- 批量存取
- 视锥测试
- 玩法分区
- 服务器区块
- 区块生成批量set接口
- 永久区块
- 增量修改
- 热区块和冷区块,冷区块使用RLE+区间树/线段树或者LZ4
- leveldb,使用LZ4
- 固定大小的工作线程池
- 主线程负责计算需求、更新状态机、投递任务和提交完成结果
- 工作线程只读取 chunkPos、generationId 和不可变世界生成参数,生成 ChunkData 并写入线程安全完成队列
- 提交前校验区块状态、requesterCount 和 generationId,过期结果直接丢弃
- 服务器关闭时停止接收任务,清空未开始任务,等待工作线程退出并丢弃无效结果
- 客户端区块
- 批量buildAirRows
- 热缓存和冷缓存
- 多线程网格构建
- 区块边界用颜色表示不同加载状态
- 贪婪网格,影响纹理/平滑光照/AO/透明
- 新区块平滑显示
- 远距离区块景深
- 区块LOD,优化draw call
- 24旋转态
- RayCast选择方块
- 破坏和放置方块
- 方块定义数据化
- 地形生成:Perlin Noise,Simplex Noise,3D Noise,Wave Function Collapse
- 世界生成:温度场/湿度场/大陆性/侵蚀度/山脉强度,河流,建筑
- 寻路算法:NavMesh,Jump Point Search
- 类似红石的门电路
- NPC实体
- 删除spawn配置,改成自动寻找最高点
- 传送
- 重发coreChunks
- 客户端视野,避免cull grid过大
- lastChunkPos写成哨兵
- 多世界
- 昼夜系统
- 控制、实体、必需区块和普通区块使用独立队列,按顺序发送,存在队头阻塞后再考虑 KCP 多通道
- 字节令牌桶限制区块进入 KCP 的速率,超过 KCP 高水位时暂停普通区块
- Snapshot 和输入都可能停止发送时,增加 KeepAlive
- 考虑公网:三次握手,NAT
- 增加服务器错误,当前handleHandshake和onClientHello等地方出错会等待超时
- 线框模式
- 贴图集,材质
- 阴影映射
- 环境光遮蔽
- 方块光照传播算法
- LOD
- 光线追踪
- ImGui动态纹理
- 删除GetGlyphRangesChineseFull
- 多机器人压力测试
- 游戏内更改设置,客户端设置/世界设置