22 年前的 PSP 掌機,大多數人應該都是將它收藏起來,沒有在玩,而國外有神人 Yifeng Wang 近日卻打破了硬體極限,成功將 PC 經典射擊神作《絕對武力》(Counter-Strike)完美移植到這台老主機上。他將此專案命名為《OpenStrike》,把效能壓榨到極致,遊戲僅佔用不可思議的 12MB 記憶體,還能在 PSP 上運行出順暢的 60 FPS。

22 年前的 PSP 跑《絕對武力》還有 60 FPS!OpenStrike 僅占約 12 MB 記憶體
根據外媒 PCGamer 報導,開發者 Yifeng Wang 做《OpenStrike》專案雖然只是為了概念驗證,但也付出非常大的心血。建立他自己基於 Rust 語言開發的 3D 引擎「Pocket3D」,加上一個名為「PocketJS」的 JavaScript 引擎。
Pocket3D 引擎用於負責玩家移動、碰撞偵測、AI 機器人、武器、子彈與場景繪製等不能掉幀的工作。遊戲規則、武器參數和畫面上的血量、彈藥、準星、比分等介面,則交給 PocketJS 架構處理,並透過內嵌的 QuickJS 執行 JavaScript 與 TypeScript。
簡單來說,底層最吃效能的部分由 Rust 負責,上層的遊戲規則和介面則保留 JavaScript 容易修改的特色。只要更動 `rules.ts`,開發者就能調整回合流程、機器人數量或武器設定,不必重新改寫整套 3D 引擎。
這套架構厲害的地方是,整個 OpenStrike 專案在 PSP 上的記憶體占用約 12 MB。
初代 PSP 雖然配備 32 MB 記憶體,但實際留給使用者程式的空間大約只有 24 MB。根據 Yifeng Wang 公開的記憶體分析,包含 Rust 引擎、QuickJS、JavaScript 程式與整張處理完成的地圖,執行檔約占 6.2 MB;QuickJS Heap、引擎狀態和每幀頂點暫存區的使用高峰約 4.4 MB,意味著,最後還是有留下約 13 MB 空間。
OpenStrike 現階段是 v0.1 概念驗證版本,距離完整重現 CS 1.6 還有一段距離,不過完成度已經很高。
目前版本測試過 8 張經典《絕對武力》地圖,包括 de_dust、de_dust2、de_inferno 與 cs_office。玩家可在地圖中跟 AI 機器人進行殲滅戰,消滅所有機器人就算獲勝。如果玩家先死亡則判定失敗,遊戲會自動開始下一回合並保留比分:
OpenStrike 能在 PSP 上維持 60 FPS 的速度運行,其關鍵是盡可能不讓 PSP 執行多餘的工作。
值得一提的是,原版《絕對武力》使用的是 GoldSrc 時代的 BSP 地圖格式,而 BSP 全名是二元空間分割,它會先把整張地圖切分成許多區域,而地圖檔案中還包含 PVS,也就是「可能看得見的區域」資料。
舉例來說,在 Dust2 的戶外,引擎透過查表就能瞬間判斷畫面的可視範圍。那些藏在牆後、看不到的房間和通道,引擎會直接忽略、不做任何檢測,自然也不會浪費 GPU 效能去繪製。
這種技術很適合 PSP。現代顯示卡有足夠效能處理更複雜的遮蔽剔除演算法,但 PSP 最缺的就是運算資源。與其每一幀都重新判定可視範圍,直接沿用 1990 年代就寫好的運算結果更好。
光影處理也是類似想法。GoldSrc 地圖原本附有 Lightmap,用來記錄牆面、地板和物件的陰影與明暗變化。OpenStrike 沒有讓 PSP 在啟動遊戲或執行期間重新計算光影,而是在電腦編譯遊戲時,就先把 Lightmap 的結果烘焙進模型的頂點顏色。
PSP 只要按照這些顏色把三角形畫出來,硬體便會完成顏色漸層,不需要再多疊一層即時光影。
當然,這也有代價,遊戲畫面就不會有現代遊戲的動態光源與華麗陰影,但對 4.3 吋、480 × 272 解析度的 PSP 螢幕來說,這個取捨很合理。
OpenStrike 已經在 GitHub 以 MIT 授權開源,除了桌面版本,也能打包成 PSP 的 EBOOT 執行檔。沒有實機的玩家,可以使用 PPSSPP 模擬器執行。如果要在真正的 PSP 上安裝,則需要一台能執行自製程式的主機,將打包完成的資料夾放進 Memory Stick 後,OpenStrike 就會出現在遊戲選單中。
要注意的是,此專案沒有提供 Valve 擁有版權的地圖和材質檔案,玩家必須自行從合法持有的《絕對武力》遊戲副本準備 `.bsp` 地圖與 `.wad` 材質。GitHub README 表示,理論上任何 GoldSrc 時代的 BSP v30 地圖都能使用。

