您的位置 首頁 暗黑破壞神

【心得】我的 D2R 測試報告

哈啰,大家好
隨著暗黑破壞神二:獄火重生 (Diablo II : Resurrected, D2R) 的 public beta 即將進入尾聲,相信大家對於遊戲仍有相當多的疑問,也讓板上的討論熱鬧了起來,但也發現了一些容易讓人觀念模糊或混淆的地方,因此產生了計劃寫這篇報告的想法。(原先只想解釋測試階段與bug的關係,但因為上周實在太忙,加上周末自己測試後有一些新發現,所以合併一起撰寫)

身為一個閑暇時會做遊戲自嗨的 QA 測試工程師,想在這邊跟大家討論兩個面向:

    • D2R 背後可能的技術細節
    • Beta 測試到底是什麼

不過畢竟我不是專業的遊戲從業人員,也不是暴雪的員工,所以對於暴雪內部真正的方案或定義只能透過我對於遊戲開發的知識、測試專業以及逆向工程來挖掘與分析,如果有說錯的地方,還請相關專業的大大指正。

一、D2R 背後可能的技術細節

而大家都知道 D2R 是著重在畫質和音效的重製,而在系統機制上,不管是官網的介紹,或是製作人的訪談,會提到 D2R 是基於 D2 的引擎所開發,所以能呈現原汁原味的遊戲內容,也讓許多人開始討論起所謂的「畫質重製」究竟是基於什麼樣的遊戲引擎開發出來的。

在這邊我要先讓大家釐清一個觀念,在遊戲內的「畫面渲染 (Render)」、「系統機制 (System)」、「物里運算 (Physic)」、「用戶介面 (User Interface, UI)」、「事件 (Event)」等功能,其實是不同的,雖然上述這些功能可以建構一個完整的遊戲,但各項功能其實是可以單獨開發的,而遊戲引擎就類似遊戲開發的「工具集」,儘可能地將各種開發工具包含其中,如果有用過 Unreal Engine、Unity,亦或是 RPG maker 的大大應該就會知道,遊戲引擎內會提供預設的材質、模型、場景、物理參數、腳本設計和運行測試,也方便用戶直接將遊戲文件、代碼、材質等加密打包,相反的,遊戲製作是可以不需要用到遊戲引擎的,例如網頁遊戲,或是獨立開發的小遊戲。

遊戲製作是需要多種專業之間的協作才能完成,例如你會寫程序,也許可以做出一個完美高效的遊戲核心和機制,但因為沒有畫面的渲染,所以消費者依然無法玩到你所設計的遊戲。(純文本遊戲除外);相反的,如果你的美工設計相當厲害,能畫出精美的圖形、製作精細的 3D 模型,可以渲染出以假亂真的場景或物體,但你不會寫程序、不會拉骨架,這些作品就是單純的作品,並無法變成遊戲讓人遊玩。

為了方便大家能直觀的理解,以下我會將遊戲內容簡化成「畫面渲染」、「系統機制」和「用戶介面」三個部分來討論。

D2 是個 20 年前製作的老遊戲,要進行畫面的重製其實相當的簡單(相對於整個重做來說),會對編程有涉略的大大應該知道,程序的運行方式是逐行運行,也就是說後面運行到的代碼會疊在之前運行的代碼之上,簡單來說就像是:
第一行設置變數 a 等於 1,第二行設置變數 b 等於 3,第四行回傳 a + b 的結果:
從右邊的 console 也可以看到,程序運行的結果為 1 + 3 = 4。

但當我再添加一行告訴程序 a = a + b,接著才在第四行回傳 a + b 的結果:

這時可以從右邊的結果發現計算結果變成 7,雖然第一行聲明了變數 a 等於 1,但程序第三行又在聲明了 a = a + b,所以這時的變數 a 會變成 1 + 3 等於 4,接著第四行又再一次計算 a + b,而第四行的 a 因為已經變成了 4,所以計算的過程變成了 4 + 3 等於 7。

這個邏輯在變更遊戲貼圖材質也是通用的,有玩過上古捲軸 5 mod的玩家應該也非常清楚,這也是為什麼上古捲軸載入 mod 時,會非常重視 mod 的載入順序,因為先載入的貼圖資源會被後載入的貼圖資源覆蓋,適合的高畫質貼圖 mod,搭配喜歡的光線渲染參數 ENB,再加上正確的載入順序,可以讓原本的遊戲被改成幾乎不同的遊戲。

根據個人的分析,D2R 也是利用同樣的方法來進行畫面貼圖的重置,如下圖可以知道:
上半是懷舊模式的畫面,下半是獄火重生模式,左右兩邊分別是在兩個地點拍攝的,其中可以發現
,當原版畫面中出現這種石筍的貼圖時,在重製畫面中會被載入為簡易帳篷。  

像暗黑破壞神這種隨機生成的場景,並不像大多遊戲的場景一樣是全手工繪製而成,而是開發者會製作大量構成場景的一些要素(牆壁、障礙物、樹木、石塊、屍體、骨骸、房屋等地圖對象),再由程序運行時隨機拼湊生成(當然也可以限制一張地圖最多只會載入多少張地圖區塊,從而讓每次產生的地圖大小大致相同),因此只要讓程序能知道玩家的角色進入邪惡洞穴時,程序要抓取資料庫中的哪些區塊拼湊成地圖,就能順利載入重製過的高畫質貼圖。

而技能特效也是一樣的方式,所以德魯伊的裂地之火才會有破圖的狀況,因為原本 D2 的裂地之火效果不包含深度,只是單純在地面繪製技能動畫,但不知道為啥 D2R 的技能設計要把這個技能添加一個深度…但地板本身又沒有厚度,所以這個技能在地圖的邊緣就會產生破圖。

而要讓程序載入高畫質貼圖的方法有三種:
1. 針對資料庫修改,把產生地圖相關的代碼要載入的資源對應到新版的文件。
2. 將重製後的文件替換掉相同路徑下的相同文件名,程序抓數據時就只會看到唯一的新版文件,然後讀取進去處理。
3. 利用程序逐行運行的特性,用後面載入的高畫質貼圖覆蓋掉原先載入的原版貼圖(這也是 mod 的運作原理)。

這時我自己就產生疑問,一方面官方說是基於原本的引擎所重製的遊戲,另一方面有常聽到有大大說 D2 的原代碼已經遺失,所以無法動到太多核心機制。但遊戲代碼是遊戲公司的命脈,暴雪這麼大一間公司有可能在代碼管理上出現這麼大的紕漏嗎?另一方面, D2R 究竟是用哪種方式做重製呢?

這就是我測試時發現的一個重點,雖然我的電腦配備並不算太差(CPU: i5-8600, GPU: RTX 2060 6GB, RAM: 16G),但當我快速切換多重複雜場景時(例如從死亡之殿 1F 往 2F 樓梯的旁邊,開發送門回魯 高因,然後立刻進入發送門返回死亡之殿 1F,接著迅速點樓梯到 2F,目的是為了讓顯卡渲染畫面時產生延遲),這時會發現 D2R 會先載入舊版的遊戲畫面,然後在大約 0.1~0.3 秒左右的時間恢復成重製版畫面。這時我所擔憂的事情就浮現了:

D2R 難道真的只是在原本封裝好的 D2 外再套一層新殼嗎?

從上面遊戲開發的技術可以知道,開發者可以利用載入順序覆蓋變數或是資源,那 D2R 就極有可能是先運行 D2,然後利用後續的程序替代掉原先載入的資源,這樣就能達到畫質重製的效果。(其實就跟 mod 一樣)
如此一來就能做到資源覆蓋的效果,按下G件進入懷舊模式,也只要讓後面 D2R 的負責畫面處理的代碼不運行,就能切換回舊版畫面,這種運作方式,等於讓程序讀取了兩次文件,運行了兩次的畫面渲染,因此在顯示性能上會有一定程度的影響,但這種方法也可以在不修改遊戲本體的情況下做到擴充和修改的效果。

而添加的 7.1 聲道音效,只要將原先的效果音、背景音、音樂重新錄製,再放入文件中,將 D2 的音效刪除,讓 D2R 的代碼讀取新版的音效文件就行。(上面三種方法的第二種)

用戶介面的部分,這次使用這介面是完全重製,因為就如一開始所說,系統機制跟用戶介面其實是可以分開開發的,開發者可以在 D2R 程序的部分加入新版的 UI,然後讓顯卡渲染畫面時,將新渲染的畫面「完全覆蓋」舊版畫面,就一樣能顯示新舊 UI 切換的功能。

D2R 畫面渲染不透明度 0%:D2 畫面(懷舊模式):

D2R 畫面渲染不透明度 50%

D2R 畫面渲染不透明度 100%(獄火重生模式)

這樣也能解釋為什麼會有大大遇到遊戲地圖顯示不完全的問題(我自己也有遇到),而遇到這問題,有時候只要重新進出該地圖、放大畫面,或是移動一下就能解決。(顯卡要重新渲染最新的畫面,所以原先因為 bug 被跳過的對象載入也會再度被運行,從而恢復正常)

而穿模(兩個對象互相穿透的問題)也是時常發生,如下圖,我的角色在重製畫面看起來已經跨越石頭,可以往下走,但實際上卻不能,切回原版畫面後會發現,原來我的角色碰撞區根本沒有跨過這顆石頭的碰撞區。

在這邊要在幫大家補充一個細節,玩遊戲時常看到兩個物體相互碰撞,然後被阻擋或是彈開,但其實在 3D 建模中,物體的外觀跟碰撞區是完全不同的東西,因為畫面渲染需要計算畫面內所有場景跟物體的面,以及每個面之間的光線變化,動畫或電影可以用好幾天去渲染一個畫面、模擬最真實的碰撞效果,但對於每秒要渲染 60 幀的畫面、每秒要計算 60 次碰撞結果的遊戲來說,逼近真實的計算是不切實際的,因為會讓玩家像在玩投影片一樣,所以即使在精細的貼圖和建模,有時候碰撞區會是用球形、立方體,甚至是凸殼的形狀來表示,也就造就「爬牆壁」、「摸不到物體」、「子彈打在空氣上」等奇妙事件……。

剩下的添加功能,例如自動撿錢,則可以在 D2R 的程序中增加檢測掉落金幣座標與角色所在座標的關係,當角色座標接近金幣座標時,角色身上存有金錢數量增加地上金幣的數量,刪除地上金幣顯示且刪除掉落狀態:(粗略示範,真正遊戲的判定沒這麼簡單)

if (player.x === coin123.x) && (player.y === coin123.y) {
    player.coin += coin123.number;
    display coin123 = false;
    delete coin123
}

而加大的倉庫、共享倉庫因為會牽涉到資料庫數組(例如 json )的內容,所以這部分應該是連同 UI 重製一起重新設計。(希望是 D2 的 UI 部分代碼沒有遺失,這樣未來在用戶介面調整上才有比較大的彈性空間)

而我擔憂的地方就在於,如果原版 D2 的代碼真的遺失,現在的 D2 就是加密封裝後數據,那麼 D2R 能重製調整的地方真的就會受到很大的限制,包含原本 D2 就有的 bug。

以上是我目前測試出來的結果,說實話我目前的想法是趨向 D2 代碼真的已經部分遺失,所以製作團隊只能用覆蓋的方式重製遊戲,對於這點是有點小失望;但如果問我在知曉這些問題的前提下會不會買遊戲?我會說:「等正式版推出後看看他們的 debug 和優化能力。」

謝謝大家的觀看,第二點的何謂測試,我留到二樓再說明~
本文來自網路,不代表3樓貓立場,轉載請註明出處:https://www.3loumao.org/15721.html?variant=zh-tw
返回頂部