
283KB Rust 核心點樣撐起 ASCII 城市?拆解字元 atlas 同 GPU batching
14,400 個字元逐格畫都唔窒,關鍵在於減少重複工作
283KB 裝住嘅係引擎核心,唔係成隻遊戲
Grow Now! Games 呢個 ASCII City prototype 已經有可玩版本,入口放喺開發者 Ko-fi 頁面,攞到 build 後可喺 browser 運行。Tom’s Hardware 檢查最新版本載入嘅檔案,發現 Rust 編譯而成嘅 WebAssembly 模組只有 283KB,啟動時預留約 1,152KB linear memory。不過要講清楚,283KB 只係 Wasm 引擎核心,字型、JavaScript、頁面同其他資源唔計喺入面,唔可以當成全個遊戲容量。

圖片:Grow Now! Games
Rust 先起城市,JavaScript 接手搬資料
個世界本身係一個格仔城市,記住道路、樓宇高度、表面種類、顏色、窗款、著燈狀態同室內平面圖等資料。Tom’s Hardware 檢查 binary 後,見到 Rust 部分有城市、世界、人口、室內同 rendering 等模組,亦會產生本地地圖,再將一批壓成 base64 嘅 byte arrays交俾 JavaScript。即係 Rust 負責城市規則同大量資料,browser 介面同畫面就交返俾 Web 技術處理,分工幾實際。
WebAssembly 喺呢度嘅價值亦唔止「Rust 跑得快」咁簡單。城市生成同模擬可以用有明確資料結構嘅 Rust 寫,編譯成細小 binary 後,又照樣由 JavaScript 呼叫。對細型 browser game 嚟講,咁樣既保留 Web 頁面容易部署嘅優點,又唔使將成套世界邏輯塞入一大堆 JavaScript object。

圖片:Grow Now! Games
14,400 格點解只使一次 draw call
桌面版本個畫面係 180 × 80 格,即每 frame 14,400 個字元。如果逐格呼叫 fillText,CPU 要不停排字、轉狀態再叫 browser 畫,成本好快疊上去。呢個 renderer 會先喺一張隱藏 Canvas 將每個「字元加顏色」組合畫一次,整成 character atlas,再用一次 texImage2D 將成張 atlas 上載去 GPU。之後每格只係揀 atlas 入面相應位置,貼落一個長方形 quad。
每個 quad 由兩個三角形、合共六個 vertices 組成,所以全畫面最多要處理 86,400 個 vertices。數字睇落唔細,不過 renderer 會將所有可見格塞入同一個 vertex buffer,一次過上載,再用一個 drawArrays 畫晒成個 frame。GPU 處理幾萬個簡單 vertices 唔出奇,真正容易拖慢畫面嘅反而係幾千甚至過萬次細碎 draw call;將佢哋 batch 埋一次做,先係成件事跑得順嘅重點。
WebGL 失靈都仲有兩層後備
最新 build 會先試 WebGL,fragment shader 做嘅工作相當簡單,主要係由 atlas 讀取 texture。Browser 冇 WebGL 時,就轉用 Canvas 2D drawImage,照樣由 atlas 搬字元;網址加 ?direct 仲可以改成逐格 fillText。後者效率最差,但查錯時幾有用。由呢條路徑亦睇得出,畫面唔係預先錄好,亦唔係一張扮文字嘅大圖,而係每格都按城市狀態重新揀字。
手機版亦會主動減少工作量,行數降至 48,欄數按裝置落喺 96 至 168 之間。呢種調整幾值得 Web 開發者參考:fallback 唔使完整複製最快嗰條 rendering path,只要保住功能同方便除錯;畫面密度亦唔使死跟桌面設定,細屏硬塞 180 欄,字細到睇唔到都冇意思。
「冇 texture、冇 shader」已經唔可以照字面理解
開發者介紹初版時話冇 Unity、Unreal、3D model、texture 或 shader,當時重點係成個城市由格仔世界同 raycasting 砌出,冇傳統美術資產。最新可玩版經 Tom’s Hardware 檢查,就明確用咗 WebGL shaders 同一張字元 texture atlas。兩邊未必互相矛盾:項目由單一 HTML 原型改到 Rust Wasm 加 WebGL,架構明顯演進過;而佢仍然冇使用一般遊戲嗰類牆身、人物或車輛貼圖。
呢個項目最有參考價值嘅地方,係佢將限制變成一套清楚嘅 rendering budget:Rust 管世界資料、atlas 消除重複排字、batching 減少 GPU 呼叫,最後再留 Canvas 後備。至於佢可唔可以由技術 demo 變成完整遊戲,就要睇室內、多層樓宇同日後互動系統可唔可以提供足夠玩法。
參考來源
- Tom's Hardware — Walk through a 3D cyberpunk city built purely from ASCII characters — a text-based metropolis runs on a 283KB Rust WebAssembly engine feeding a WebGL renderer — original report
- ASCII City Update: Interiors, Elevation & Skyscrapers — 開發者官方更新影片,交代室內、多層樓宇、城市高度同可玩 prototype 進度。
- A Walkable ASCII Cyberpunk City in One HTML File — 開發者官方初版示範,解釋格仔世界、raycasting 同冇傳統 3D 美術資產嘅設計。
- Grow Now! Games:ASCII City Prototype — 開發者提供可玩版本嘅官方入口。
- MDN:WebAssembly concepts — 補充 Wasm 作為 Rust 編譯目標,以及同 JavaScript 配合運作嘅背景。
- MDN:WebGL texImage2D — 核對將 Canvas 字元 atlas 上載成 WebGL 2D texture 嘅 API 用途。
本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。







