The Space Project: A Self-Running Space Economy Simulator in Rust and Bevy

The Space Project: A Self-Running Space Economy Simulator in Rust and Bevy

Overview

The Space Project 是一個由代理人驅動的經濟模擬系統,其運作方式如同太空中的自動化「水族箱」。與傳統遊戲不同,它沒有劇本化的故事情節或玩家目標;相反地,它提供了一個原生的 3D 客戶端,讓使用者作為觀察者或「上帝模式」管理員,觀察一個複雜的太陽系經濟如何自主演化。

Core Simulation Mechanics

該模擬系統創造了一個活生生的經濟體,市場會自行尋找價格,而人口會根據幸福感與資源可用性進行遷移。

Agent-Driven Ship AI

太空船是利用 Goal-Oriented Action Planning (GOAP) 系統的自主代理人。前瞻規劃器會根據抽象的世界狀態,對各種目標(例如:交易、交付、加油、改裝或休息)進行評分,並構建一個行為樹來執行最具成本效益的計畫。如果出現更具利潤或更緊急的選項,太空船能夠在飛行途中重新規劃。

Dynamic Economic Model

價格並非固定不變。該模擬系統在每個站點採用訂單簿市場(order-book market),根據涵蓋模型(coverage model)與短缺緊急度乘數,為 13 種不同的商品定價。太空船會在這些市場之間實體移動供應,透過其交易活動直接影響價格波動。

Facilities and Production

設施會執行生產配方(包括熔煉、精煉、製造、耕作與採礦)。這些設施會經歷退化與使用工具自我修復的生命週期。它們可以從等級 1 升級到 10,若長期處於破產狀態,則可能會被遺棄。

Population and Faction Dynamics

  • Populations: 消費食物與燃料,同時產生勞動力。當情緒因壓力或短缺而崩潰時,人口會實體遷移到更幸福的星系。
  • Factions: 透過向成員設施徵收稅收,並發布補貼合約來應對長期短缺,藉此管理經濟。派系(Factions)也會在需求未被滿足的地方資助建設新設施。
  • Construction: 當發生長期短缺時,會生成建築工地。這些工地會累積交付的貨物,直到達到 100% 完成度,屆時它們會轉化為持久性的設施。

Technical Architecture

該專案使用 Rust 編寫,並採用解耦架構,以確保模擬過程具備確定性(deterministic)且可測試。

The Crate Workspace

該專案分為五個不同的 crate:

  • sim_core: 包含純粹的模擬邏輯(hecs ECS、GOAP 規劃器、經濟系統)。它是嚴格的無 IO(IO-free)設計,且不導入 tokiosqlx 等非同步(async)函式庫。
  • sim_db: 透過 sqlx 處理 SQLite 持久化,包括 ECS 載入器與遷移(migrations)。
  • sim_server: 一個提供 HTTP/WebSocket 處理程序的函式庫 crate,用於無頭模式(headless mode)。
  • sim_protocol: 定義了用於無頭模式與 CI 的 WebSocket 通訊協定類型。
  • client_bevy: 使用 Bevy 0.18 與 egui 的主執行檔。它將 sim_core 嵌入為一個 Bevy Resource,允許渲染器直接查詢模擬的 ECS 世界,而無需進行數據轉換(marshalling)。

Performance and Scaling

目前該模擬系統支援約 485 個活體代理人(包括太空船、設施、人口與派系),在 125 ms 的預算內,p50 tick time 為 10–20 ms。該架構設計目標是擴展至 100,000 個代理人。

Key Technical Constraints

為了維持穩定性與確定性,開發者實施了三項主要規則:

  1. sim_core 保持純邏輯,沒有非同步或 IO 依賴。
  2. hecs ECS 作為 tick 期間的唯一事實來源(single source of truth),tick 迴圈持有排他的可變存取權,以避免每個代理人的鎖定(locks)。
  3. 跨實體效果透過 SimCommand 緩衝區處理,確保一個階段(phase)讀取世界狀態並寫入指令,隨後在下一個階段套用指令,以防止階段中期的寫入衝突。

Tech Stack

| Component | Technology | | :--- | :--- | | | Language | Rust (Edition 2021) | | Renderer | Bevy 0.18 (搭配用於行星與星雲的自定義 WGSL shaders) | | Simulation ECS | hecs | | UI | egui (透過 bevy_egui) | | Particles | bevy_hanabi | | Persistence | SQLite via sqlx | | Networking | Axum and Tokio (用於無頭模式) |

Development Insights

該專案是作者與 LLM Claude 的協作成果。這種方法引發了社群對於 LLM 在現代軟體開發中角色定位的討論:

"rust 的嚴謹性似乎真的能幫助他們 [LLMs] 寫出正確的程式碼,而 ECS 架構似乎讓他們更容易理解運作機制(因為他們一次只需要在上下文中持有少數的系統與組件)。"

雖然有些使用者對研究 LLM 生成的程式碼之價值表示懷疑,但其他人則指出,這類工具讓個人開發者能夠建立複雜的模擬系統,而這類系統若在以往可能因耗時過來不及開始。

Sources