遊戲代碼應該追求優美,還是能跑就行?
遊戲代碼的道與術。
今年我玩了近百個小時的《哈迪斯2》,其中一部分時間是在遊戲的文件夾中度過的。
樂趣在於,《哈迪斯2》的大量核心邏輯、技能數值和關卡流程都是用Lua腳本編寫的,這些文件直接以純文本形式存在於遊戲目錄中,可讀性很高,任何玩家都可以輕鬆閱讀、理解。
換句話說,進入磁盤文件尋找contents/scripts,這其中的將近480個文件、50多萬行lua代碼,就像一本細緻的遊戲設定集,讓你能夠深入瞭解遊戲的各個系統包含有哪些內容,又是怎樣運作起來的。
比如說,衆所周知“哈迪斯”系列以文本量大著稱,十分注重劇情故事和人物塑造,而在這些文件中,就可以找到所有角色的全部對話。
對劇情有興趣的玩家在翻看時,得做好“劇透”的準備
清晰易讀的另一個好處是,不僅便於開發者後期對遊戲的維護和拓展,同時也給與玩家更多操作的可能——因爲遊戲數值清晰可見,所以修改起來無非就是改動下數字,幾乎不費功夫;Mod作者也不需要進行復雜的逆向工程,還能結合開發者留下的註釋作爲教程,難怪遊戲在玩家社羣中被稱爲“對Mod”最友好的遊戲。
12月剛剛在玩家社區引起熱議的人氣Mod《扎格列歐斯之旅(Zagreus Journey)》就是個挺典型的例子。
這個大型Mod允許玩家直接操縱2代主角墨利諾厄重新體驗1代的全部冒險,不僅全面復刻了1代的關卡、敵人,還調整適配了戰鬥機制,全面支持阿卡那牌、忠誓任務、信物等系統,新增了數十種收集資源與大量劇情故事。
如果不是《哈迪斯2》的“代碼底子”足夠好,很難想象MOD作者能夠單槍匹馬在不到一年的時間裏完成這麼大的工作量。
這當然是遊戲的開發商Supergiant Games有意爲之。早在2020年的初代《哈迪斯》時期,其就在與玩家交流的問答環節提及:“遊戲的許多方面都很容易修改,因爲數據都是公開的。”玩家能夠更改所有的文本和數字,併爲遊戲自由添加內容不受限制。
而哈迪斯的口碑和熱度延續,似乎也一定程度論證了“好代碼”的積極作用:不論從日後持續迭代遊戲或是激活玩家參與內容創作的角度,這些“背後功夫”都不是白做,還能夠賦予作品更廣闊的成長空間。
所以說,遊戲開發者有什麼理由不去盡力優化代碼呢?
1
還真有。或者說,代碼“能跑就行”,至今仍是遊戲行業中的一種普遍論調。
2024年的《小丑牌》拿獎拿到手軟,儼然被行業視爲風向標,但其遊戲代碼卻遠不如遊戲設計那麼優美,許多複雜的遊戲邏輯,如不同小丑牌的效果疊加、分數計算,都是直接用大量的、嵌套的if-else語句堆砌而成,導致代碼看起來原始且重複。
遊戲開發者LocalThunk曾經直言不諱《小丑牌》的底層代碼是用“希望和夢想粘在一起的”,頗有些“俺尋思這可以,沒想到真的能行”的自嘲意味。
當時也有不少遺憾的聲音,表示這樣的底層代碼使得《小丑牌》難以隨着時間的推進進化、拓展機制。
然而在相關討論中,經常是支持者佔了上風。一方面,大量的if-else語句在代碼效率上固然不算好,但同時也具備容易理解的優勢,這使得玩家能夠相對輕鬆地在覈心玩法框架不變的前提下添加新的小丑牌。
另一方面,不少遊戲開發者都站出來解釋,如果代碼能夠正常運行,那麼就沒必要鑽牛角尖。例如一位曾供職過R星的獨立開發者就表示:“要記住目標是發佈遊戲,而不是編寫最簡潔、最優雅的代碼。”
這些支持者大多認爲,只要代碼能跑,便於調試,並且沒有嚴重影響性能,那就已經合格——大多數情況下,只要達成上述條件,玩家也不會在意遊戲背後的代碼如何運作。
就說飛沒飛吧
事實上, LocalThunk最終也是這麼達成了自我和解:“它並不完美,但我知道每個東西在哪裏,而且我是唯一需要維護它的人,所以這對我來說很有意義。如果它很蠢但是有效,那麼它就不蠢!”
LocalThunk原本就只是一位業餘遊戲開發者,在遊戲開發過程中神經一直繃得很緊。根據其自己發表的開發記錄,《小丑牌》完成之前,他已經長期焦慮、失眠,甚至一度因焦慮症發作去了醫院。
可以想象,在開發者光是爲了構思創意、實現創意就已經費盡心神的情況下,很多時候是無暇顧及“精修”代碼的。
不是所有人都擁有高超的編程技術,對於創意工作者,花費時間在代碼上,往往意味着打磨創意、填充內容的時間被擠佔。
真要以代碼水平去要求《小丑牌》的話,此消彼長下,遊戲的創意水平大概率達不到今天的高度,甚至連遊戲能否正常發佈都得打個問號——這其實是大多數獨立遊戲都會面臨的問題。
很多玩家今天耳熟能詳的作品,實際上都充當過編程的反面教材。《傳說之下》作者在處理對話系統時使用了一個巨大的switch語句,導致遊戲中的每一個對話分支、每一個角色的每一句話,幾乎都堆在一個幾萬行的超大函數里;《蔚藍》的主角控制邏輯包含了超過5000行代碼,攀爬、跳躍、衝刺、物理判定、動畫切換,全部擠在一個文件裏;初代《我的世界》的Java代碼也是出了名的隨性混亂,致使遊戲底層架構臃腫,後續花了多年時間重做。
知名程序員、id Software創始人之一約翰·卡馬克曾舉證:“我兒子說‘寫代碼不過是if、else和for循環而已’”
離中國玩家更近的一個例子或許是《太吾繪卷》。對不少國內玩家而言,這是一款具有劃時代意義的產品,感情很深,既是因爲它當初閃電般的迅速崛起,也是因爲在那之後對遊戲正式版的漫長等待。
不少人可能還記得,回望2018年,《太吾繪卷》的代碼水平最初是被當作神話或是傳說來傳播的。遊戲製作人茄子只看了一個月Unity教程就上去寫遊戲,結果“蛐蛐大神保平安,綠皮逆練代碼無BUG一遍過”,遊戲順利發佈並引發轟動——事實是,遊戲出色的成績和一言難盡的代碼水平構成了鮮明的反差,繼而成爲其最早的一大記憶點。
如果故事只到這裏,那麼或許還稱得上因禍得福。但EA上架的《太吾繪卷》和上線時已經趨於完成的《小丑牌》處境並不相同,遊戲的玩法框架要更自由,茄子本身也還有更多的想法要去實現。
這就導致原本的代碼無力承載,茄子則在遊戲大獲成功後迅速表態希望“把遊戲裏千瘡百孔的代碼一一修補起來,爲大家帶來一個在程序上,更強健、穩定、高效的好玩的遊戲”。
後來《太吾繪卷》花了那麼大力氣去償還技術債務,大概也是意識到,“差代碼”有時能夠使得一款好遊戲更早順利發佈,但同時,“好代碼”能創造更多可能,讓一款好遊戲變得更好。
2
好的代碼能發揮什麼作用?
2024年與《小丑牌》有並駕齊驅之勢的《動物井》,開發者Billy Basso歷時七年,基於C++自行開發遊戲引擎。最終,這款畫面精緻、動態光影複雜的2D像素遊戲,安裝體積被壓縮到極致的33MB。
由於代碼高度自研且沒有任何冗餘的第三方庫,Basso能夠對遊戲的各個方面進行完全的掌控,同時也滿足了他構建和理解底層系統的樂趣。
比如遊戲中讓玩家印象深刻的視覺效果和光照,他表示沒有采用單一的着色器,而是使用了約50個小的獨立技術,包括動態陰影、邊緣光照、水體效果、流體系統等等。
Basso在GDC上的技術分享
最終,這種優美的底層代碼爲遊戲的解謎提供了物理層面的深度,也從根本上影響了遊戲核心的解謎機制。
玩家或許不會直接審視代碼的好壞,但更好的代碼確有可能爲玩家帶來更爲優質的遊戲體驗和更深刻的印象,就像Basso曾表示《動物井》還可以做到更小:“如果我知道人們會如此印象深刻,我可能會更加努力地縮小它”。
也可以說,當遊戲的核心玩法樂趣高度依賴代碼的複雜功能時,後者的存在感難免愈發明顯。
高自由度的《Noita》以技術著稱,遊戲只設定下物質的基本規則,如水遇火變蒸汽,酸腐蝕木頭,剩餘的一切交給玩家自行探索,從中誕生出了各種超乎預想的玩法和戰術。
其玩法核心的背後是自研的“Falling Sand”引擎:屏幕上的每一顆像素——無論是流動的液體、燃燒的火焰還是被炸碎的岩石——都具備獨立的物理屬性和化學反應邏輯。
實現這種“像素級物理”需要極高水平的多線程架構和數學建模,相應的,開發團隊設計了一套極其穩健的實體組件系統(ECS),使得成千上萬個具備物理屬性的像素點可以相互碰撞、傳導溫度、發生相變。
從這個角度看,代碼已經不止是實現創意的工具,而是作爲創意本身與玩家發生交互。
放在過去,好的代碼往往是隱形的。就像一個人身體健康,那麼一切都自然而然,只有哪個部位出了毛病,纔會清晰感知到其存在。
但隨着遊戲品類的豐富,開發者與玩家之間的關係拉近,代碼時不時也會浮出水面,作爲開發者“研發態度”的象徵,進而影響到產品的對外形象。
像《戴森球計劃》早期做技術分享,就有玩家“恍然大悟”,都是模擬類遊戲,爲何戴森球十分流暢,隔壁天際線卻卡到不行。
包括前面提到的哈迪斯,也是因此收穫玩家盛讚,即便玩家可能看不懂代碼,但至少讀得出誠意。
隨之而來的是,伴隨着遊戲的長線運營,“優美的代碼”也成爲需要持續維護的對象。
舉個例子,好評如潮的模擬工廠流水線遊戲《異星工廠》,至今保留着他們的Factorio Friday Facts每週博客文章,目前已更新到400多篇,事無鉅細地與玩家分享詳細的更新內容、開發見解、新功能和遊戲機制,技術細節涵蓋從引擎改進到代碼效率提升的方方面面。
這下,連代碼也成爲維繫玩家的紐帶了。
結語
回到最開始的問題,遊戲代碼應該追求優美,還是能跑就行?
我在reddit上翻到一篇關於“好代碼”重要性的帖子,一位小有名氣的遊戲製作人Tomas Sala和網友論辯了十來個回合,幾乎快演變爲人身攻擊,依舊難分勝負。
Sala堅持“創意落地”優先於“代碼優化”,功能性雖然重要,但更關鍵的是向玩家提供一種獨特的體驗。
以他自己的作品《堡壘:獵鷹戰紀》爲例,就是以一種“又快又野”的實用方式寫出來的,結果營收超過100萬——所以不要浪費時間在“好看”的代碼上,爲了在現代遊戲市場中生存,需要儘快且低成本地驗證思路。“Steam上95%的遊戲不需要維護,因爲並不成功,糾結於代碼完全是白費力氣”。
網友則反擊,代碼做得越好,迭代與打磨玩法樂趣就更容易。優化代碼、提升代碼能力,本質上是一種對未來的投資,既能爲今後作品做更好的鋪墊,也能有效避免後續的技術債務。
這背後倒是讓人體會到兩種並行的市場背景。一邊是3A沒落,獨立遊戲來到行業地位高點,從業人員更加崇尚“創意爲先”。對於以機制創意或敘事驅動的作品,“能跑就行”的代碼性價比高,因爲其核心魅力在於“點子”,代碼只是完成創意的工具。
另一邊,長線運營成爲行業常態,保持遊戲活力、維護玩家關係成爲了大趨勢。再加上AI技術的發展,技術普惠進一步降低了玩家參與遊戲內容創作的門檻,這又對遊戲代碼提出了更高的要求。
而所謂的“好、壞代碼”,或許也只是南橘北枳罷了。