2018-11-28 08:47:23來源:GameRes游資網編輯:誠
那些對“傳火”近乎癡迷的冒險者,如今在探索羅德蘭王國時恐怕已不再那么苦痛,他們可以癱倒在床、卷入被窩,舒適的從北方不死院踏上征程。但在這背后,《黑暗之魂 重制版》邁向 Switch 的旅途卻并不順利,維塔士大約從去年8月起就接手了移植工作,經歷了漫長的等待后,這款作品直到今年10月才正式發售。
移植游戲得花上一年多的時間?這或許讓人有些困惑。有人將延期的原因歸咎于平臺的性能問題,也有不少人認為任何理由都是托詞,甚至衍生出“是為了給其它作品發售讓路”的陰謀論。這些言論并非單單針對某一款產品,它們或許已經成為玩家看待移植工作的普遍觀點。
面對人們積蓄已久的不滿情緒,維塔士制作人 Lukas Codr 此前還詳細剖析過項目的難點,盡管這項工作看似只是簡單的“搬家”,但在實際進行操作時,無論是代碼的兼容、還是幀率的匹配,亦或是截然不同的網絡系統都暗藏著巨大挑戰。
這并非個例,Team Cherry 在將《空洞騎士》搗騰到 Switch 平臺時,前前后后也花去了一年時間。移植同樣成為了許多日本廠商難以跨過的高檻,內容搬運后缺胳膊少腿、錯誤頻出早已被視為一種正常現象。如此看來,要做成這門“吃老本”的生意沒有想象中容易,它背后又需要突破哪些關隘?
在高級語言和跨平臺的游戲引擎興起之前,各平臺的內容移植成本可能難以想象。不同硬件的運行規則,幾乎可以將底層的邏輯全都翻新一遍,隨之而來的結果便是:僅有關卡、數值和系統這些概念層面的東西能夠沿用下來,而圖形素材、音樂資源往往都得重新制作。
作為佐證,上世紀八九十年代的游戲在移植過程中往往被改得面目全非。1984年,《炸彈人》開發商 Hudson 與任天堂合作,負責將幾款 FC 上的作品搬到家用電腦 PC-8801 和夏普 X1 上,其中不少游戲受經移植后已經完全變樣,這種改變甚至深入到核心的設計部分。
原版《馬里奧兄弟》(水管馬里奧)的主要玩法是從下層撞擊平臺,將敵人撞翻后跑過去消滅它們。底層中央還有個名為“POW”的方塊,撞擊后所有在場的怪物都會翻轉過來,等同于 STG 游戲中的“保險”。但經由 Hudson 過一道手,PC-8801 上的《馬里奧兄弟 特別版》簡直可以當成另一款游戲。
劣化后的圖形素材暫且不提,特別版的關卡和玩法幾乎完全變樣。玩家時而需要穿梭左右橫移的平臺,時而又需要利用“蹦床”震翻敵人,游戲還加入了限時收集道具的元素。有趣的是,這些魔改當時并不讓人反感,設計上也有許多獨特之處,反而彰顯了第三方廠商的創意和實力。
從技術層面來看,Hudson 對內容進行換皮和翻新或許也是被逼無奈。早期的游戲基本都由匯編構筑代碼,與今天編程的高級語言不同,它有時會具體到寄存器和內存地址的調用,而在移植過程中,每個平臺、每塊芯片的指令集、位寬,甚至連寄存器數量都不一樣,這成了難以調和的麻煩事。
以 SFC 和 MD 為例,它們處理器分別為65c816和摩托羅拉68000。前者只有2個寄存器,而68000則包含8個通用寄存器和8個地址寄存器,兩者的尋址邏輯、調用命名、資源的處理和存放地址截然不同。
對于匯編而言,在 x86 架構轉向 x64 架構時,改一下數據格式和名稱還勉強管用,而放到 ARM 架構時這套規則就像天書,有時重寫代碼還要更為效率。
2013年時,有開發者試圖將 SFC 上的《星際火狐》移植到 MD 平臺,但他最終只完成了一個簡單的 Demo。不僅缺少聲音和精細的圖形素材,整體的運行效率也就8~9幀,完全算不上一款可玩的游戲,足以見得這背后的困難程度。
不過,隨著硬件性能的提升,人們想到另一個圍魏救趙的辦法:既然重構老游戲的匯編代碼這么麻煩,倒不如重構老游戲的運行環境,將程序和模擬器捆在一起。一個較為常見的說法是,如果新平臺和老平臺的指令集、操作系統完全不同,那么大致需要10~40倍的 CPU 算力才能實現模擬,這在今天已經不是問題。
西班牙開發商 BlitWorks 就是“模擬移植法”的好手,該公司的創始老哥 Angel Horna 癡迷于鉆研新舊游戲平臺的特性,曾經還編寫過盛名在外的 Nebula(星云)模擬器。它們在2012年接到世嘉委托,負責將 DC 上的《街頭涂鴉》(Jet Set Radio)高清化,并移植到各個主流平臺。
盡管 DC 上的游戲已開始通過高級語言編寫,但要對細枝末節進行修改,并將其帶到 PC、移動端和其它主機平臺仍是不小的工作量。讓人出乎意料的是,BlitWorks 只花9個月就完成了任務,達成這項壯舉的訣竅在于,它們構建了一種新的混合技術,從而使得新平臺能夠運行舊代碼 —— 說白了,其實也就是將 Dreamcast 模擬器和游戲整合了一下。
實際上,為了讓新機器能夠玩上老游戲,索尼這些年來也一直在研究模擬器。PS3 上有 PS1、PS2 的模擬器,PS4 上也默默出了幾個 PS2 游戲的模擬版,與 BlitWorks 的邏輯可能十分相似。而在剛剛發布的 PlayStation Classic(迷你 PS)中,索尼還植入了它們過去所反對的東西:以開源架構設計的民間模擬器 PCSX ReArmed。從中也能看出潛移默化的態度轉變。
如果說太久遠的作品有點難搞,那么隔代、或者同世代游戲的移植又如何呢?它們的出產日期最多差個 6~7 年,代碼和硬件制式的變化也沒那么大。在這一點上,雖然現今的內容移植確實簡單不少,但如果要彰顯誠意,保留原汁原味的體驗、甚至高于原汁原味的體驗,同樣是個勞神費力的苦差事。
讓我們繼續述說 BlitWorks 的幕后軼事。在將 PC 平臺的《Fez》移植到 PS3 上時,它們又發現了一個新的難點,該作主要由 C# 編寫,而 PlayStation 平臺當時對此并不支持。該問題有兩種解決方案,要么是將 Mono Runtime 整個移植到新平臺,要么是用 C++ 把游戲重寫一遍。
(*注:PS 不支持 C# 原生開發,但支持 Mono 這個環境,所以可以將《Fez》代碼整合到 Mono 中。)
如果繼續使用 C#,游戲可能會受到 CPU 性能的掣肘,就像早期的 Xbox 360 版本一樣;而如果將代碼轉寫為 C++,又會變成漫長而乏味的任務。由于無法預估 C# 移植產生的問題,BlitWorks 最終還是選擇了轉寫,這也能夠保證游戲更順暢的運行。
事實證明它們做出了正確的決斷,盡管《Fez》看起來是一款 2D 像素游戲,但內部其實包括很多 3D 結構和多邊形塊。處理這些圖形對于 PC 和本世代主機來說是小菜一碟,但直接搬運到移動平臺、或上世代主機時卻會遭遇著色器相關的麻煩。不過正因為進行了轉寫,BlitWorks 此時可以輕松的對部分代碼進行調整。
《Fez》在移植的過程中還衍生出一個副產品。為了日后更輕松的將 C# 轉換成 C++,BlitWorks 在2013年推出了一個名為“Unsharper”的自動化軟件,它隨后也被應用于《全金屬狂怒》《堡壘》等獨立游戲的移植工作。
你或許會認為這些專接外包的小廠技術力不夠,所以才會把事情搞得這么麻煩。但為了將《最后生還者》從 PS3 弄到 PS4,即使是大名鼎鼎的頑皮狗也愁白了頭。在接受 Edge 雜志采訪時,該作的創意總監 Neil Druckmann 就半開玩笑的說:“我真希望有個按鈕能夠一鍵「打開 PS4 模式」,但結果與預期一致,(移植過程)就像地獄一般。”
事實上,由于新老兩代主機的規格和運行方式略有不同,《最后生還者》起初在 PS4 上的運行效率不到10幀。即使對渲染相關的代碼進行重新優化,游戲也沒能達到每秒30幀的“基礎要求”,就更別提宣傳口號中的“60幀”目標了。根據首席程序員 Christian Gyrling 的回憶來看,當時距離作品的發售節點已不足3個月,團隊中彌漫著一股恐慌的情緒。
問題的癥結主要在于,將分辨率提高到1080P、并更新了一批美術素材后,每幀畫面的處理和渲染速度實在是太慢了。頑皮狗的解決方案是將 CPU 的負載分流為兩部分,讓它首先只計算玩法,算完之后再對圖形進行渲染,畢竟一個有序通行的岔路口,可比大家都擠在一起堵死要好得多。這么整搗一下,開發團隊陡然發現 —— “1080P+60幀”的目標居然真成了。
不過,幀數提高本身又會給項目帶來新的挑戰。為了填充這多出來的30幀,《最后生還者 重制版》還得從原始動畫數據中重新采樣,并逐幀調整美術細節。這在動作游戲中可能更加麻煩,《黑暗之魂2》最初的武器耐久值就通過幀數判定,當 PC 玩家以60幀的效率運行游戲時,裝備的損耗速度明顯增加。
關于游戲移植的另一則趣聞是,就在幾個月前,國內媒體盛傳《最終幻想8》沒有移植的原因是“源代碼丟失”。但事實上,該作的高清復刻早在2013年底就登陸了 Steam,這一傳言甚至漂洋過海,還被 Square Enix 的技術總監土田善紀拿出來調侃了一番:
我聽到了有傳言說 FF8 不能移植是因為源代碼丟失了,不知道這種流言是怎么來的呢?但是明明已經有移植過了的 Steam 版了呀?一般來說,不可能會有這都保管不好的事情發生吧?不過話說有人看到我 FFT 的角色動畫程序了嗎?我找不到它了。
土田可能沒想到,此番針對傳聞的發言,最后卻陰差陽錯指到了社友野村哲也的腦袋上……在開發《王國之心HD 1.5 Remix》時,他們其實搞丟過初代的源碼,為此只能深度的挖掘原作,并對內容進行重建。碰巧的是,搞丟源代碼的糊涂蛋絕非只有 Square Enix,這甚至成了一種行業常態。
對于許多專注游戲移植的團隊而言,它們的工作往往始于一張光盤,而不是源代碼。《旺達與巨像 重制版》的開發商 Bluepoint 創始人 Marco Thrush 曾經表示,為了湊齊100%的內容,它們總是得從零售光盤里獲取數據,然后進行拆包和反向編譯。盡管經驗豐富的開發者,能從拆包文件中找到許多有用的資源,然后通過重建引擎的方法將所有內容都拼回去,但這背后又會徒增許多不必要的成本和精力。
Hyjinx 工作室就是“源代碼遺失”的受害者,在幫 Konami 制作《寂靜嶺 高清典藏版》時,它們拿到的源碼居然不是最終版本,其中還包含了早期的 Bug 和內容缺陷。負責移植的制作人 Tomm Hulett 打趣的說到:“游戲中有一處 Heather (《寂靜嶺3》人物)還是藍色的。”
由于摻雜了大量的紋理問題和 Bug,一部分材質和聲音也得自己提取,Hyjinx 工作室花了兩年時間才把這個 HD 合集給搞定。作為參考,《寂靜嶺2》從無到有其實也才用了兩年。
值得警醒的是,反向編譯有時還不能解決所有問題。
加拿大開發商 Beamdog 曾打算對《冰風谷2》進行重制,但該作的所有權隨著混亂的企業收購多次易手,導致游戲的源代碼無從追跡。它們調查過雅達利轉交給威世智的數據,也向黑曜石的朋友尋求過幫助,最終還是無功而返。而最大的難點在于,現存市面上《冰風谷2》(包括 GOG 版)的代碼幾乎都經過了壓縮,Beamdog 也無法從本體中取得完整、有效的信息,只能取消整個項目。
即使是暴雪這樣的廠商,對源代碼的保護有時也會疏忽大意。2017年5月,時值《星際爭霸 重制版》的制作節點,Reddit 用戶 Khemist49 卻從 eBay 上淘到了一張“《星際爭霸》母盤源代碼”的刻錄盤。他將光盤返還后得到了“隆重”的感謝,暴雪寄來了一大摞外設和周邊產品,還為他報銷了嘉年華活動的所有費用,并邀其共進晚餐。
近幾年涉及到移植的難度,通常與平臺之間的程序、引擎支持相關。比如用 DirectX 技術編寫的程式,在只支持 OpenGL 的硬件上就不會那么好用。由于許多廠商都開始使用虛幻和 Unity 等跨平臺引擎,與之對應的游戲只需要進行較少的適配工作,已經算是很好移植了。
讓我們將眼光聚焦回《黑暗之魂》Switch 版本身。黑暗之魂初代所用的引擎名為“PhyreEngine”,這是索尼2008年在 GDC 上開始宣傳的一款產品,Falcom 旗下的《英雄傳說 閃之軌跡1》,以及 Square Enix 旗下的《勇者斗惡龍 建造者》都使用了這個引擎開發。雖然 PhyreEngine 由索尼制作,但它們倒是持開放態度,無論你是開發商、發行商還是中間件團隊,都可在任何平臺上基于引擎打造產品。
問題在于,PhyreEngine 直到今年1月17日才支持 Switch,而維塔士至少從2017年8月起就已經開工了。這意味著它們要么參照老思路,可能得自行一個個調用 OpenGL 的原生 API;要么廢棄一部分之前的工作,研究 PhyreEngine 的新版特性。相比之下,前者的工序復雜而不穩妥,后者可能更便于紋理、著色器的直接調整,但又面臨著新版引擎兼容不完善的風險。
Unity 此前也不乏踩坑的例子,《Sword of the Guardian》制作人 Billy Chan 認為,Unity 對 Switch 的支持就不太完善,他的作品在 PC 和 Xbox One 上能以60幀運行,而當縮減為30幀的 Switch 版本時,游戲中人物移動將有不自然的滑動。
《尤卡萊莉大冒險》和《戰神:夜襲》的移植工作,同樣也因引擎問題而遭受阻礙,這些中小型的開發者和外包團隊,當然不具備頑皮狗那樣的資源去逐幀修改內容。
除了引擎所帶來的問題外,雜七雜八的小毛病還需要耗去更多時間,比如現代化的操作適配,長寬比和界面的調整,以及游戲本身與平臺的內容聯動。《黑暗之魂》Switch 版就新增了6人聯機,其中需要做大量的優化工作。而 Bluepoint 重制《旺達與巨像》的第一項工作 —— 是得搞一套日版的 Linux 系統,用來打開官 方提供的硬盤文件。
從商業的角度來看,移植、復刻、重制如今都成了一種有利可圖的策略。整體上,它能以低于新內容的制作成本,來重新煥發老品牌的價值。與此同時,玩家也樂于在續作或者系列重啟前,體驗到一款經過細致包裝的老游戲,這理應是享受經典的絕佳方式。
不過,電子游戲歷史基金會創始人 Frank Cifaldi 卻認為,這些工作在情感和藝術上還有著額外的意義:“我認為意識也是繼承的一種形式。我想說的是,通過重新制作來延續這些作品的生命力,絕對是在保護游戲的傳統、理念和世界地位。”
無論對應的是成功的商業模式、亦或是背后的藝術價值,它們本身就已決定了,移植和翻新在最為基礎的理念中也不應被當成簡單工作。從最早的硬件隔閡,到現今數不盡的爛攤子,一款作品的轉移過程也可能包含著密密麻麻的任務,這需要非凡的專業知識,同樣面臨著額外的后勤和美術需求。
盡管在缺少官 方信息的情況下,外人無法剖析更為深入的原因,但《黑暗之魂》的移植工作或許也卷入了相似的漩渦。試想一下,結合之前那些苦痛的案例,當你需要重整幾萬行陌生的代碼時,它的困難與否自然也就心中有數了。