大家已經見識過可以在各種奇怪「機器」上玩的《毀滅戰士》了——孕檢棒、智能冰箱、打卡機甚至是電子菸,只要有塊螢幕、能算加減,它就能運行這款1993年的FPS始祖遊戲。

就在這幾天,「萬物皆可DOOM」的玩法又迎來了新的一頁:在Windows自帶的「畫圖板」軟體上,讓《毀滅戰士》滿幀流暢運行起來。
更重要的是,這次整活的不是什麼民間高手,而是微軟Azure的首席技術官(CTO),馬克·魯西諾維奇。

兩年前,其實就有人嘗試過用Windows XP的畫圖來移植運行《毀滅戰士》。
當時那位技術大牛的版本,使用了一種類似「自動化輔助畫圖」的方法。當玩家打開遊戲程序時,腳本會在後台運行遊戲,逐個區域分析像素,最後再調用油漆桶工具在Windows XP中填充出對應的畫面。
由於Windows XP承受不住這種頻繁的點擊和計算,導致當時這款《毀滅戰士》基本無法正常遊玩,每「畫」出一幀畫面,就要等待足足1到3分鐘,頂多只能算是一次概念性整活。

這次微軟CTO馬克帶來的版本,則達到了原版《毀滅戰士》的35 FPS上限。
他的做法,也不是在Windows畫圖里原生運行遊戲,更像是把畫圖當成了一塊逐像素刷新的顯示器。
就像他在這個項目的介紹里說的一樣,「畫圖」渲染了遊戲,但它不計算遊戲。所有計算的工作,都交給了後台一個負責所有物理邏輯、怪物AI和畫面生成的引擎,但這個引擎不向顯示器輸出任何畫面。
等到後台算好了每一幀畫面,它就會把計算好的圖像以像素為單位複製到剪貼板中,然後粘貼到Windows畫圖里。當程序以極高頻次把生成圖像粘貼進Windows畫圖時,肉眼就能看到一個正在實時刷新的遊戲畫面。

原理聽起來很簡單,但真做起來還是遇到了不少難題。
馬克遇到的第一個瓶頸,是後台引擎算得太快。如果Windows畫圖還沒來得及把上一幀畫面粘貼好,下一幀就把剪貼板給覆蓋了,畫面會直接崩掉。於是,馬克就在系統底層建立了一套「傳話機制」,畫圖必須老老實實打個報告說「我粘貼好了」,後台引擎才會把下一幀發過去。
至於操作方面,由於這版《毀滅戰士》調用了剪貼板來「渲染」畫面,會讓鍵盤信號始終處於畫圖軟體的快捷鍵範圍內,無法傳達給後面的程序。於是,馬克又給引擎加入了一個底層攔截鍵盤信號的功能。
每當玩家按下WASD或滑鼠控制角色時,按鍵信號就會在傳達Windows畫圖之前,搶先一步被攔截並直接「偷渡」到後台的遊戲引擎,從而實現在畫圖軟體中直接操控遊戲。

這個項目開發完成之後,被馬克取名為DoomPaint,並上傳到了GitHub上。由於Windows畫圖每次接收到新畫面,在系統底層都被視作一次「對文檔的編輯」,這就導致了一系列奇奇怪怪的「先進功能」:
比如玩家如果不小心被怪物打死了,不需要找存檔,直接狂按Ctrl + Z撤銷,畫面就會像倒帶一樣,一幀一幀地退回到你幾秒鐘前還沒死的健康狀態;想保存高光時刻,不需要任何第三方截圖軟體,直接在Windows畫圖左上角點擊「文件」、「保存」,就能把當前戰況生成一張無壓縮的圖片。

由於馬克」微軟Azure CTO」的這重身份,很多人在了解這次整活前,都以為這是一次對Azure的宣傳營銷,尤其是要展現CTO對於AI的理解和運用。
但事實上,這版《毀滅戰士》用上的技巧和代碼多是臨場手搓,和他負責的虛擬機、AI算力等雲服務基本沒什麼關係——看起來確實就是馬克的個人愛好。
就和很多致力於「萬物DOOM化」的極客一樣,這位高管這次只是一個回歸了程序員的身份,參與到了這樣一場老派極客的浪漫活動中。在充滿規矩的代碼世界裡,技術最原始的魅力,或許永遠來自於那句「因為這樣很有趣」。






