用 Rust 和 Bevy 打造的自运行太空经济模拟器

查看原文 HN 讨论

文章摘要

The Space Project 是一个用 Rust + Bevy 写成的「零玩家」太空经济模拟器:没有剧本、没有任务线、没有胜利条件,只有几百个各自独立决策的自治体在一个太阳系里做生意、破产、迁徙和重建。作者 Kalcode 的说法很直白——这不是游戏,而是一个沙盒;他一直想折腾经济模拟,又痴迷太空题材,于是就做了出来。

模拟的核心机制相当扎实。每艘船跑自己的 GOAP(目标导向行动规划)planner,在「跑最优贸易航线」「接一单运输合约」「去加油」「到船厂改装」「回港让船员休息以免士气崩盘」之间自行权衡,并且会在飞行途中因为出现更好的机会而重新规划。每个空间站都有自己的订单簿市场,为 13 种商品定价,采用带「短缺紧迫度乘数」的覆盖率模型,而且供给是真的靠飞船在站与站之间搬运产生的。合约系统有六种类型(配送、快递、载客、补贴、供应、船员任务),带完整生命周期、声望门槛、自动续期和随时间递增的报酬。设施会按配方生产(冶炼、精炼、农业、采矿),会随时间损耗、用工具自修、可升级到 10 级,长期亏损则会被废弃并腐烂。派系收税、针对短缺发布补贴合约、在有需求的地方出资建新设施,彼此还维持两两关系。人口消耗食物和燃料、产出劳动力,压力大时发合约,情绪长期恶化就直接举家迁往更幸福的星系。长期短缺会催生建造工地,逐步累积送达的货物,最终实体化为一座新设施。

技术上,作者把「纯模拟」和「渲染」拆得很干净:sim_core 用自己的 hecs ECS,完全同步、无 IO、不碰 async 和数据库,因此可单测;Bevy 客户端直接把它当库嵌进来,模拟与渲染共享同一个世界,零序列化开销。整个工作区分五个 crate(sim_core / sim_db / sim_server / sim_protocol / client_bevy),跨实体影响统一走命令缓冲(SimCommand)以保证确定性。持久化用 sqlx + 内置 SQLite,单个原生二进制、无运行时依赖,存档就是二进制旁边的 <universe>.db,重启后从上次那一 tick 精确续跑。渲染侧有手写 WGSL 着色器做程序化行星、日冕、星云和星场,egui 做检视面板,bevy_hanabi 做 GPU 粒子尾迹与爆炸。目前规模约 485 个活跃自治体(282 艘船、93 座设施、27 个人口群、8 个派系、60 个天体),tick 的 p50 在 10–20 毫秒,预算是 125 毫秒,架构目标是冲向 10 万+。

项目还有一段有意思的前史:最初是 Elixir/Phoenix 原型,但 BEAM 调度器在 Windows 游戏 PC 上表现挣扎,于是整个引擎被重写成 Rust;早期的 Godot 客户端还留在版本历史里,但已经不再维护。作者坦承相当大一部分代码是与 Claude 结对写出来的——正是这一点让他能在业余时间把项目推到这个体量。代码 MIT 开源,他明确欢迎任何人 fork 接手,「或者它就停留在某种 AI 产出的半成品状态也行」,但他觉得作为一个可供各类游戏复用的模拟引擎,现在的状态已经不错了。

HN 评论精华