
引言:當“萬物皆可運行 DOOM”遇到極致創意
在技術圈,“萬物皆可運行 DOOM”是一個廣為流傳的梗,從計算器到數碼相機,無數設備都被大神們成功移植了這款經典游戲。但如果這個問題變得更瘋狂一些:如果游戲的墻壁是真實的電路板銅線,敵人是芯片封裝,會是怎樣一番景象?
答案就是 KiDoom 項目。它將 1993 年的經典游戲《毀滅戰士》(DOOM)渲染在了一個專業的 PCB編輯器 KiCad 中。這個項目背后充滿了巧妙的技術構思和令人驚訝的實現細節,下文將為你揭示其中最有趣的五個事實。
-----------------------------------------------------------------------------
1. 核心理念:一場“無人問津”卻極致優雅的技術炫技
KiDoom 并非為了解決任何實際問題,它的誕生源于一個純粹的好奇心和技術探索精神:“如果 DOOM 的墻壁是真實的 PCB 走線會怎樣?” 項目的創建者旨在回答一個根本沒人問過的問題,這本身就充滿了一種極客式的浪漫。
What if DOOM's walls were actual PCB traces? What if enemies were QFP-64 chips and health packs were SOT-23 transistors? KiDoom answers these questions nobody asked...
這種看似“無用”的創造,恰恰是技術社區創新精神和幽默感的最佳體現。它證明了最純粹的樂趣往往來自于探索技術的邊界,而非僅僅滿足實用需求。
2. 技術突破:從每秒 0.15 幀到可玩的關鍵轉變
項目最初的構想是使用 PCB 焊盤來逐個像素地渲染游戲畫面,但這個思路很快被證明是行不通的。
- 每幀像素數: 320 x 200 = 64,000 個
- 渲染時間: 64,000 個焊盤 × 每焊盤 0.1 毫秒 = 每幀 6.4 秒
- 最終幀率: 0.15 FPS (完全不可玩)
真正的突破在于一個“頓悟時刻”:開發者意識到 DOOM 引擎內部本身就是以矢量(線段)而非像素來計算可見幾何體的,它將這些數據存儲在drawsegs[]和vissprites[]等內部數組中。而 PCB 的銅走線恰好也是矢量數據。這個發現徹底改變了實現路徑,其渲染效率比像素掃描方案快了 200 到 500 倍。
- 每幀線段數: 約 100-300 條
- 渲染時間: 約 200 條走線 × 每走線 0.1 毫秒 = 每幀 20 毫秒 (+ 刷新開銷)
- 最終幀率: 10-25 FPS (足夠進行基本游戲)
這個從像素到矢量的思維轉變,是整個項目得以從一個不可能的想法,變成一個可玩的技術演示的基石。
3. 最具創意的設計:用芯片封裝的復雜性來代表游戲角色
KiDoom 項目中最為精妙的設計,在于它建立了一套實體映射系統:游戲中的不同實體(敵人、道具等)被渲染為不同復雜度的真實 PCB 元件封裝。
| 游戲角色 | PCB 封裝 | 引腳數 | 示例 |
|---|---|---|---|
| 收藏品 | SOT-23 | 3 | 醫療包、彈藥夾、鑰匙卡 |
| 裝飾物 | SOIC-8 | 8 | 油桶、尸體、火炬 |
| 敵人 | QFP-64 | 64 | 僵尸、惡魔、玩家 |
這種設計的巧妙之處在于,它創造了一種“任何 PCB 設計師都能直觀理解的視覺層級”。一個強大的霰彈槍手是一個復雜的 64 引腳芯片,而一個簡單的醫療包只是一個 3 引腳的晶體管。為了實現這個映射超過 150 種不同游戲實體的系統,開發者必須深入 DOOM 的 C 語言源代碼進行修改。挑戰在于,游戲原生的vissprite_t渲染結構體中并不包含實體的類型信息。解決方案是直接對引擎進行“外科手術”:通過修改r_defs.h文件為vissprite_t結構體增加一個mobjtype字段,并在r_things.c文件的R_ProjectSprite()函數中捕獲thing->type,從而在渲染每一幀時都能精確知道每個實體的具體身份。
4. 架構解密:它并非在 KiCad內部運行 DOOM
一個常見的誤解是 KiDoom 讓 DOOM 運行在了 KiCad 內部,但事實并非如此。在這個項目中,KiCad 只是作為“顯示器”或“渲染器”。真正的 DOOM 游戲引擎是作為一個獨立的 C 語言進程在后臺運行的。
項目采用了一種“三模式渲染”架構,同時運行三個并行的可視化窗口:
- SDL 窗口: 真正玩游戲的地方,顯示完整的 DOOM 畫面。
- Python 線框窗口: 用于調試,顯示從游戲中提取出的矢量線條。
- KiCad PCB 窗口: 項目的主角,顯示由銅走線構成的墻壁和由元件封裝構成的實體。
每一幀的數據都遵循一個清晰的流程:從 C 語言的 DOOM 引擎drawsegs[]和vissprites[]數組中提取幾何數據,通過 Unix 套接字序列化為 JSON 格式,再由 Python 腳本接收并解析,最終更新到 KiCad 的畫布上。這種清晰的架構劃分,展現了項目并非一個簡單的腳本,而是一個經過深思熟慮的復雜系統。而整個系統的性能瓶頸,也清晰地指向了 KiCad 的 Python API 調用pcbnew.Refresh(),這一步會消耗 30-50 毫秒,是幀率的主要限制因素。
5. 最終觀感:復古街機風與現代工程工具的奇妙融合
KiDoom 的最終畫面既不像現代游戲的精細像素,也沒有復雜的紋理,而是一種獨特的線框風格,仿佛是復古街機游戲與現代工程軟件的結合體。
Think "1982 vector arcade game meets 1993 FPS meets 2025 PCB editor."
畫面的關鍵視覺元素包括:
- 墻壁: 藍色(B.Cu 底層銅)的銅走線框。
- 實體: 真實的 PCB 元件封裝。
- 遠近提示: 近處的走線更粗,遠處的更細,以此實現深度暗示。
- 天花板/地板: 并非逐扇區渲染,而是由簡單的全屏漸變色代表。
KiDoom 將經典游戲、復古的矢量圖形美學和專業的工程軟件這三個看似無關的元素,成功地融合成了一種前所未有的、令人著迷的視覺體驗。
-----------------------------------------------------------------------------
結論:在限制中誕生的極致創意
KiDoom 不僅是一個成功的技術演示,更是一個關于創造力、問題解決和技術熱情的精彩故事。它向我們展示了,即使是使用最意想不到的工具,只要有足夠的巧思,也能創造出令人驚嘆的作品。
Is it practical? No. Is it efficient? Barely. Is it the correct use of a professional PCB design tool? Absolutely not. But it works.
這個項目留給我們的思考是:在你的專業領域,是否存在一些看似“不務正業”卻能激發無限創意的瘋狂想法?或者,下一個能運行 DOOM 的,會是什么意想不到的東西?
項目主頁:
https://www.mikeayles.com/#kidoom
-
電路板
+關注
關注
140文章
5329瀏覽量
108529 -
KiCAD
+關注
關注
5文章
324瀏覽量
10447
發布評論請先 登錄
探索Broadcom ezPyro? 背板電路板:開啟紅外傳感評估新旅程
電路板離子污染的核心危害和主要來源
同惠TH2851 LCR測試儀在電路板故障檢測中的作用
FCT自動測試設備:電路板性能檢測利器
了解電路板氣密性檢測儀,讓電路板品控更靠譜-岳信儀器
激光焊錫工藝在電路板產品的主要應用
【案例3.9】電路板無法啟動的故障分析
2塊含有cyusb3014的同樣電路板插接在同一臺電腦上,如何實現用CYAPI對2塊電路板cyusb3014的slavefifo總線讀取和寫入呢?
印刷電路板 PCB 與印刷線路板 PWB 區別
貼片電解電容在電路板中的作用
射頻電路板設計技巧
KiDoom:在電路板上玩《毀滅戰士》
評論