本篇文章更新時間:2026/04/10
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持 。
內容目錄
如何在 25 MHz 的 CPU 上跑出交通流動感?讀《How Pizza Tycoon simulated traffic》有感
編輯前言:這篇文章讓我重新思考:很多看似複雜的系統,其實靠極簡邏輯就能呈現驚人的效果。尤其是遊戲開發中,我們常常不小心「想太多」。原文出自《How Pizza Tycoon simulated traffic on a 25 MHz CPU — Pizza Legacy Blog》。
核心觀點 (Key Takeaways)
- Pizza Tycoon 的交通系統幾乎完全依靠「一律單向的道路」與「每塊 tile 自帶方向」來達成看似複雜的車流。
- 移動邏輯極度簡化:每 tick 移動 1 pixel,每 16 pixel(即一格 tile)才處理一次轉彎判定。
- 碰撞偵測不是高深演算法,而是便宜的 O(n²) 配對,但因為大量早期退出,使得成本非常低。
深入解析
原作者在重製 Pizza Tycoon 的過程中,花了 14 年才成功重現遊戲中最迷人的交通效果。這段故事對我來說有種「打開舊遊戲黑盒子」的快感,也讓我看到當年遊戲工程師如何用極少的計算資源,達成如今看來仍不失魅力的動態城市感。
「I went into it with a brain full of modern concepts… and of course plenty of CPU to run it all!」
我覺得這段話正中許多現代開發者的痛點:我們慣性使用 pathfinding、collision system、scene graph,但 Pizza Tycoon 根本不需要這些。
一、道路本身就決定車流方向:完全不需要 pathfinding
文章最讓我驚訝的,是遊戲的道路 tile 本身就包含方向資訊,例如:
- 0x16:水平道路,只能左到右。
- 0x06:右到左。
- 0x26、0x36:上下方向類似規則。
- 拐彎 tile(例如 0x56)提供兩個可能方向,車子直接「丟硬幣」決定。
換句話說,地圖是一座巨大的單向道路網。一旦車知道當前 tile,它就知道下一步該往哪裡。
這個方法排除了所有複雜的 pathfinding——因為遊戲根本不打算讓車「知道目的地」,車只需要一直開下去就好了。
二、「1 pixel per tick」+「每 16 ticks 才判斷轉彎」
車輛邏輯被拆成兩層:
- 每 tick:車往 X 或 Y 加減 1。
- 每 16 ticks:才計算下一個 tile 的方向與車頭朝向。
這個架構有兩個漂亮特點:
- 大部分時間只是加減 1,非常便宜。
- 複雜的轉向邏輯只在跨 tile 時執行,頻率直接少 1/16。
加上車在生成時會隨機 offset 進度,使得所有車不會同時做 tile-boundary 計算,CPU 壓力被完美攤開。
三、碰撞偵測看似笨重,實則極快
乍看:O(n²) 好可怕?但實際上幾乎都在第一兩行就 early exit 了:
- 車向東、車向西?永不相撞,立刻跳出。
- 方向不同但不會在同一條道路相遇?跳出。
- 只有「同向且同 lane」才開始比較座標。
以典型 25 台車來說:
- 625 組 pair
- 但真正進入座標運算的只有「個位數」
最後用一個「被擋時等待 10 tick」的計時器自然形成功能性車陣。沒有車物理、沒有速度曲線,但就是看起來合理。
筆者心得與啟發
讀完後,我最大感觸是:
很多時候,我們的問題不是做不到,而是做太多。
在現代技術堆疊的思維下,遇到交通系統、AI、碰撞,我們會立刻想到 pathfinding、bounding boxes、多層級資料結構。但 Pizza Tycoon 的工程師反其道而行:
- 道路本身定義車流,不給車選擇。
- 車的出現與消失由畫面邊界自然處理。
- 遇到阻礙就停 10 tick,不做物理模擬。
- 幾乎所有計算都能早期退出。
這種極簡邏輯,不但符合硬體限制,更重要的是:呈現效果已經足夠好。這讓我重新反思:在開發或設計系統時,我是否過度追求「真實」?是否忘記「好看就好」?
如果你正在做模擬系統、城市生成、AI 代理人、交通視覺化等相關專案,我非常推薦你去看看原文。它提醒我:
有時候,只要抓到對的抽象,世界就會自己動起來。
