要找出遊戲讀取速度低落的癥結,就得先理解一個事實:硬體與遊戲,兩者的進步幅度有非常大的差異。硬體的效能呈線性增加,遊戲的規模卻是呈指數增加。硬體的進步跟不上遊戲的進步,讀取速度自然快不起來。
「每一個硬體裝置的進步幅度都不盡相同,GPU與CPU的進步遠多於硬碟的進步。」曾經參與開發《生化奇兵2》與《救火者》的程式設計師,威廉.阿姆斯壯指出,「硬碟的運作必須遵守物理法則,讀寫資料的程序牽涉到電子訊號的改變,以及多種物理裝置的運作,其效能遠遜於純粹的電路系統。換言之,物理裝置的速度完全比不上光速。」
當代硬體的效能遠比過去強大,裝置彼此卻有很大的效能落差。這些效能落差一旦累積起來,就會造成可觀的延遲。
▲硬碟的效能遠遜於CPU或記憶體。
「這一點可以用遊戲物件材質來說明。」曾經參與開發《精英節拍特工》的程式設計師,羅伯特.戴德利說,「一般的遊戲設計師習慣使用1024x1024的材質,如果你想要讓物件看起來更加精細,就得使用更大的材質。2048x2048的材質尺寸是1024x1024的4倍,所需的運算時間也是4倍。至於4096x4096的材質,其大小與運算時間則是1024x1024的16倍。」
當代遊戲為了提升物件質感而使用較大的物件材質,使得運算時間頓時飆高,從原本的1倍變成4倍,再變成16倍,尺寸與時間的膨脹速度皆呈指數增加。相對地,早期的硬碟轉速為5400RPM,現在則是7200RPM,效能的進步幅度只有區區的33%,根本無法有效應付呈指數膨脹的物件材質。
「為了提升讀取效能,使用SSD硬碟不失為一個昂貴的作法。」戴德利說,「可惜就算是SSD硬碟,也難以對抗日漸巨大化的遊戲資料。」
▲SSD硬碟效能頗佳,但還是難以滿足近代遊戲的需求。
阿姆斯壯則是指出,材質大小只是影響讀取速度的其中一項因素。「當代遊戲的規模扶搖直上,遊戲設定值的總容量連帶增加。舉凡人工智慧的參數,以及動態物理環境的安排,大量的資料集合造就一個碩大無比的遊戲。」
為了讓遊戲順利運作,遊戲主程式必須持續存取所需的資料,倘若有任何一項資料來不及送到主程式手上(原因可能是資料過大,或是硬體裝置不夠快),玩家就得等待資料存取完畢才能繼續遊戲。
眼尖的讀者想必注意到一個問題:既然遊戲資料呈指數膨脹,為什麼讀取時間沒有跟著呈指數增加呢?這是因為開發商努力研發各種加速讀取的技術,讓資料傳輸更有效率。從玩家的角度來看,讀取速度低落的確讓人心煩;可是從開發商的角度來看,只要能夠將讀取速度控制在容許範圍內,就算是成功了。
▲讀取完畢再叫我,我先去打個盹~
「『出現讀取畫面』通常不等於『讀取正要開始』。」戴德利說,「玩家看到讀取畫面的時候,主程式可能已經在幕後讀取很長一段時間。只有當玩家完成階段性行動(像是走到地圖邊緣,或是進入劇情事件之類的),主程式卻還沒有把資料讀取完畢的時候,遊戲才會秀出讀取畫面,請玩家稍後片刻。」
舉例來說,某些遊戲剛進入遊戲時,會刻意秀出一段無法跳過的商標畫面,遊戲便可以利用這個機會讀取資料。大部分的情況下,遊戲會趕在玩家行動前預先讀取檔案,開發商的技術力越高,預先讀取的動作就越難察覺。開放性世界遊戲就是預先讀取的優良表率,你在遊戲世界裡面盡情奔馳,遊戲則是在幕後持續預先讀取資料。此時此刻,你的硬碟指示燈將持續閃爍,硬碟運轉聲跟著提高,這些都是遊戲正在存取資料的證據。
(後面還有:改善讀取效能的各種議題)
▲開放性世界遊戲善於預先讀取資料。
開發商知道玩家不喜歡看到讀取畫面,所以他們會想辦法提升資料的存取速度,各種偷吃步的技術便因應而生,其中最普遍的一招叫做「烘培」。你吃過餅乾吧?要製作餅乾,首先必須將材料按比例混合,再將材料灌入模子後加熱烘培,餅乾就出爐了。
同樣的道理,開發商會事先篩選出遊戲經常存取的資料,再將這些資料打包後定點存放,讓遊戲可以隨時將這些資料叫出來用,其道理與烘培餅乾有異曲同工之妙。遊戲經常利用「剛進入遊戲」或是「關卡剛開始」的時候進行烘培,而烘培需要時間,現在你知道為什麼上面兩個場合經常出現讀取畫面了吧?
▲讀取時秀出插圖與提示,讓玩家有事可以做。
烘培是相當好用的技巧,然而使用烘培有一個大前提:遊戲必須準確預測玩家的行動。一旦遊戲無法預測玩家的行動,就不知道該選擇哪些檔案進行烘培。當前最流行的開放性世界遊戲就是一例,由於開放性世界的場景龐大,遊戲很難預測玩家的下一步,傳統的烘培很難發揮預期的效果。
「玩家的行動選擇越多,使用烘培的難度就越高。」戴德利指出,「在開放性世界遊戲中,一旦玩家快速地在場景之間旅行,就可能看見平時根本不可能出現的讀取畫面,或是看見一個來不及更新材質的超陽春場景。」
▲異塵餘生2的讀取畫面充滿復古風情。
開發商在開發遊戲時,通常以內容為優先考量,直到遊戲接近開發完成時,才會把重心放在讀取效能上。開發商必須反覆調整遊戲內容,犧牲部份的遊戲要素(通常是畫面的細節),將讀取時間控制在玩家的容忍範圍內。調整遊戲內容並非易事,犧牲一個要素固然可以換取效能,卻可能造成遊戲失衡或是臭蟲,開發商對此莫不傷透腦筋。
為了降低調整遊戲的難度,最理想的方法就是使用一套完整的遊戲引擎。優質的遊戲引擎具有較高的調整彈性,可以自動解決調整所衍伸的問題,整體效能也比較理想。可惜優質的遊戲引擎並不多,就算這些引擎開放授權使用,高額的授權費用也經常令開發商望之卻步。
▲開發商的技術力決定遊戲的讀取速度。
「我們會把遊戲的問題整理成清單,列出每一項問題的成本與修正成效,再標示出問題的優先度。」曾經參與開發《生化奇兵》的工程師,JP.里貝頓說,「開發小組習慣優先解決影響穩定性的問題,讓玩家能夠順利進行遊戲,不會碰到臭蟲或當機,優先度較低的效能問題就放在後面解決。你必須權衡狀況,找出玩家最在意的是什麼東西。效能不佳的遊戲還是可以玩,但是會當機的遊戲根本沒搞頭。」
把效能問題放到最後的做法有很高的風險,因為遊戲的開發時間有限,開發小組不可能解決所有的問題。來不及解決的問題只好利用發售當日的更新,或是之後的更新來解決,這些更新只有少數是為了臭蟲,其他絕大部分都是為了改善效能。最糟糕的情況就是放生問題,讓玩家當冤大頭。
開發商留下惱人的爛攤子,事後再努力彌補錯誤,我不知道是該罵他們沒有責任感,還是讚許他們有責任感。
▲近代顯學:利用更新改善遊戲效能。
「遊戲上架販售後,玩家的意見就像打開水閘一樣灌過來。」《仰沖異界》的遊戲監督,蘭德.米勒說,「玩家除了抱怨讀取時間,還會回報特定硬體的相容性問題,以及其他開發人員在遊戲上市前完全沒有想到的問題。有時候我們會犯錯,在遊戲進入時預載過多的資料,影響遊戲效能。所以我們得重新安排預載的資料,再推出緊急更新來修正問題。」
仰沖異界於2016年釋出後,米勒與開發商持續更新遊戲引擎,對其他平台的版本進行最佳化,找出導致遊戲出錯的臭蟲,以及其他造成效能低落的小毛病。
「我們後來發現,我們居然在載入世界的同時載入過場動畫。」米勒說,「這種做法導致讀取效能直直落,我們必須改寫角色互動系統,才可以修正這個問題。美術部門還發現部分物件材質可以縮小尺寸,不過這個任務無法由程式代勞,必須用人工個別修正。只能用鑿子,不能用榔頭,好麻煩!」
▲經過人仰馬翻的程式調整後,《仰沖異界》效能總算達到水準。
開發者必須對自己的遊戲瞭若指掌,投注無數的時間與精力,才有機會找出造成延遲的癥結,而且不保證可以解決。由於改善讀取效能的任務經常不符合投資報酬率,導致開發商不願意在這方面努力,造就市面上一堆龜速讀取的遊戲,嗚呼哀哉。
《矮人爭霸》的創意總監,傑恩.賽森指出,他們釋出遊戲後被玩家抱怨讀取時間過長,他們連忙發布更新檔來改善讀取效能。「我們試著將讀取時間的要素列入開發週期內,藉由經常性的檢查來控制讀取時間。」賽森說,「巧妙打包遊戲資料,最佳化記憶體管理,降低常駐在記憶體的資料量,如果你將這些工作放到最後才做,他們就會變得十分複雜,讓你無從下手。為了不再重蹈覆轍,我們未來開發遊戲時將採用新的工作流程,強迫大家一開始就得把讀取時間考慮進去。」
▲矮人爭霸早期同樣擁有讀取偏慢的毛病。
讀取時間是遊戲的原罪,是開發商無可避免的困境。縮短讀取時間的使命任重而道遠,開發商所能做的,就是將讀取時間盡量縮短,再利用更新改善讀取。開發商得正視讀取的問題,洞悉軟硬體的運作,才有機會改善讀取速度,讓玩家獲得應有的流暢遊戲體驗。
加入電腦王Facebook粉絲團