近期發售的 Nintendo Switch 遊戲《集合啦!動物森友會》作為近期的熱門 「社交類」 遊戲,聯機可以說是十分關鍵的一個功能。並且官方在遊戲設計上也是鼓勵玩家相互聯機交流,不論是比比誰家的大頭菜能賣得貴就去誰家賣,還是誰家有來訪的特殊商人,賣地毯還是賣古董,都可以很大程度拓寬玩家可接觸到的遊戲資源的種類,提升遊玩的樂趣。
然而,就在這個聯機功能裡,也存在著一些看似不理想的設計。
一個問題就是關於玩家進入和離開他人的島嶼時 「隆重」 的歡送儀式。玩家要花費幾十秒去存儲和等待其他玩家的連接。如果島主開放了島後,其他玩家們頻繁地進出島嶼,意味著在島上的玩家們要被頻繁地打斷,非常影響遊戲體驗。
更令人沮喪的是,還會發生 「炸島」 的情況,在一些評分網站上玩家們給予本作的打分時的負面評價很多也源自於此。
動森的聯機迷思
簡單來說,這些情況都是歸因於遊戲的存檔和同步機制。玩家在單人遊玩的時候,也就是所謂的單機模式,存檔功能就像傳統遊戲一樣:玩家可以手動存檔,遊戲也會定期自動存檔。然而在和其他玩家聯機時,也就是多人遊戲模式,事情就開始變得複雜了起來。
當前多人遊戲的存檔模式是,在開放島嶼時和有其他玩家進出島時,雙方玩家都會自動存檔。除此之外,遊戲不會在中間自動存檔。這就意味著,如果在遊玩期間有哪個玩家突然掉線,所有在該島上的玩家的遊戲進度都會重置到上一次存檔的時刻。
這無疑是非常令人沮喪的,尤其是在這期間有玩家獲得了很大的成就的時候。
那麼這些影響遊戲體驗的設計原因到底是為什麼呢?我們先來看看這樣一個簡單的情景:玩家B通過網際網路聯機到了玩家A的島上,然後慷慨地往地上扔了99000鈴錢,這時如果玩家B沒有存檔並且以非正常方式離開了該島,玩家B顯然只能恢復到上一個存檔:進入玩家A的島之前的狀態,也就是說玩家B的99000鈴錢還在手裡。
假如此刻不重置所有人的進度的話,玩家A的島上還留著玩家B留下的錢,這麼一來……錢被複製了!這個場景就是一個經典的數據同步問題。
可能看到這裡會有讀者感到奇怪:我們也玩過那麼多網遊,沒聽說過哪個遊戲誰掉線了之類的就會讓別人複製或者丟檔之類的啊?原因是因為我們通常所玩的絕大多數的網遊,都是用戶直接連接遊戲運營方的伺服器,即:主從式模式。
大部分重要的遊戲數據,比如玩家所持的道具金錢等都存儲在遊戲伺服器上,並也在只在伺服器上做改變,玩家的客戶端,遊戲主機,電腦或是手機,只是一個 「終端」,負責與伺服器之間的交互,接收玩家的操作,把結果顯示給玩家等。
所以玩家的遊戲終端所發生的問題都不會影響到伺服器上的數據,更不會影響到其他玩家。而《集合啦!動物森友會》這樣的遊戲,作為一定程度上擁有自己存檔的 「單機遊戲」,在聯機上將會和前文提的網遊有著很大的不同。
每一名玩家都擁有自己的本地存檔,而為了確保在聯機前後玩家們的數據是同步的,且不會出現比如複製這樣的漏洞,這便引出了我們接下來要討論的話題:分布式數據的同步問題。
數據同步問題
分布式這個概念可能對於現代的人來說既熟悉也陌生,或者廣義上有人也會把這種概念稱作「雲」。
但其實關於這方面的概念和技術在計算機領域已經深入研究了幾十年了,這其中數據同步是一個細分的技術領域,很多問題至今也沒有完美的解決方案。
我們不會在這篇文章中討論這些複雜的計算機科學技術,但可以藉此機會管中窺豹,同時探討下是否有更好的聯機方案。我在接下來的內容中會儘可能簡化聯機模型,真實的運作機制肯定還會有更多細節上的步驟。
分布式數據的同步會引出一些單機所沒有的問題。主要的問題為:
主機間同步的數據是否準確一致;
主機之間數據通訊所產生的時間延遲;
數據不同步或發生錯誤時的應對方法。
我們先看看《集合啦!動物森友會》的聯機模式時如何解決這些問題的。
最簡單的情況,玩家A開放小島,稍後玩家B進入,過一段時間後玩家B離開小島。容我用圖表來表示這其中數據存檔的過程。
玩家A在開放島嶼後,會進入 「聯機模式」,此刻開始產生的數據不會再自動保存,直到下次保存事件的發生。玩家B申請進入玩家A的島嶼時,此刻玩家A將會保存當前數據,並把小島的信息發送給玩家B,這時玩家B也會自動保存,接收完小島數據後,進入玩家A的小島。
在此時,玩家A和玩家B在該島上實現了數據的同步。在這期間雖然玩家可以互動,數據也在實時交換,但並沒有寫入到玩家們本地的存檔中。直到玩家B申請離開小島,雙方的主機才正式保存數據,給這次出島遊畫上了個句號。
那麼保存的數據是否準確同步呢?由於雙方都在實時更新數據,只要其中沒有發生錯誤,沒有人篡改本地數據作弊,那麼理論上數據是同步的,當然遊戲也會通過校驗來確保雙方在島上共通發生過的事情是一樣的。
再來看第二點延遲問題,由於網絡傳輸不可避免的會有延遲,這可能會導致保存的數據存在誤差。具體來說舉個例子,玩家B往地上剛扔了一大袋子鈴錢,假如在此時刻雙方玩家同時保存,玩家A由於網絡延遲還沒有收到玩家B扔下錢的信息,保存的數據中地上沒有錢。
在玩家B的保存數據中自己已經把錢扔在了地上。所以在雙方的保存數據集合裡,這袋子錢憑空消失了。為了避免發生類似的情況,最簡單的辦法就是設立一個保存前的延遲時間來給予信息足夠的時間來傳輸。
是的,你肯定想到了,這就是為何在有人進出島的時候有那麼隆重的 「儀式」,這都是為了給予存檔前必要的延遲時間來同步,包括數據時間戳檢查:判斷以哪位玩家的待保存記錄為最新時間,數據校驗等等。確保萬無一失後,各個玩家的主機才會開始正式保存。
那麼遇到了數據無法同步或者其他錯誤,比如哪位玩家掉線了怎麼辦呢?很簡單,大家也都知道了,就是 「炸島」,所有玩家的存檔回到上一次的保存點,中間發生的數據全部丟失。
在更多玩家加入後,運作機制同理。可以看出,這套機制姑且不提玩家們的遊戲體驗,至少很好地完成了在不同玩家主機間同步數據存檔的任務。不會出現複製丟失等漏洞,在功能上是合格的。
解決問題的可能
任天堂以做出優質體驗的遊戲著稱,但當前的多人聯機體驗顯然不能讓所有人完全滿意,即使這樣的設計可能是該遊戲開發團隊的工程師們左右權衡後的結果。但我們是否有可能設計出滿足了以上基本功能,並且儘可能去顧及玩家們的遊戲體驗的聯機機制呢?
我們來先試試直接解決當前玩家們的痛點。
能否省略玩家進出島時的 「歡迎/送別儀式」:前文中提到過,這段時間不僅僅是用來加載目標小島的數據,更是用來同步和存儲玩家之間的數據,如果取消或者縮短的話,很可能會影響到數據能否成功同步,對於網絡環境惡劣的聯機環境下更是尤為重要。
不過在有玩家入島時,島上的玩家會顯示「好像有人來玩了」,在這一小段等待時間後,島上的玩家會同時進行保存。理論上在此時刻已經完成了玩家間的數據同步,之後等待新上島的玩家加載數據的這段時間,應該是可以省略掉的。
假如其他玩家在保存完畢後就可以正常進行遊戲了,新入島的玩家還需要有一段加載小島數據的時間,這段時間結束後還需要同步其他玩家在這段時間內所產生的數據。如果有玩家還處於未上島還在加載小島數據的時候,有新的玩家申請上島等,這就又是一系列新的問題了。
能否避免「炸島」:當有玩家意外斷開連接的時候,為了防止數據無法同步,所有玩家退回到上一次的存檔點在當前的聯機機制中可能是唯一的選擇。
但也許我們可以嘗試儘可能減少玩家的損失,比如開啟定時自動存檔如何呢?聽上去似乎是個簡單易行的辦法,但稍微想一下就會明白,這和之前提到的為什麼玩家在進出島時有著歡送儀式有著同樣的問題:存檔需要同步。
需要一段同步時間並在這期間阻止玩家產生任何數據更改行為。簡單來說就是如果有定時自動存檔的話,島上的玩家們可能會時不時被打斷並暫停住,等待所有玩家同步保存完成,再繼續活動。無法做到單機模式那樣自動存檔不會對遊玩產生影響。
進一步來看,存檔間隔時間如果設置的短,時不時的暫停住會很影響遊戲的流暢性。間隔時間長,「炸島」後的損失和沮喪感又會增加。
嘗試網遊式的聯機模式
既然通常的主從式模式的網遊不會發生這個問題,那動森的聯機機制是否也可以擁有一個公共的伺服器來處理島上的內容,變成主從式呢?理論上來說這是可行的,但並不實際,核心根源在於動物之森不是真正的網遊,遊玩之前不必須聯網。
來試著設想一下這種模式將會發生什麼。島主在開啟小島大門的時候,島上的數據上傳至官方的伺服器,伺服器準備好了提供公共聯機服務。
島主也作為用戶之一登陸進了自己的小島,交互所產生的數據全部保存在伺服器上。其他玩家登陸上島也是同理,隨時進出小島,離開小島時就自己和伺服器同步後保存,不再存在玩家之間的同步問題,一切看上去都那麼美好。
那麼如果有人掉線了呢?好像也不會有什麼問題,對嗎?答案是否定的,有玩家掉線,雖然對其他玩家不會有直接影響,但掉線的玩家主機上還有著本地存檔,這就意味著這個存檔與伺服器是不同步的。
所以為了讓數據同步,這個玩家必須要再連接進這個小島,同步數據後正常離開才可以。在這之前不容許離線單機遊玩。
更麻煩的是,如果有玩家掉線後島主想關閉大門,這個島是否結束在伺服器上的服務呢?之前掉線的玩家怎麼辦,難道還要必須等對方上線才能結束嗎?這種種問題使得這種模式並不切合實際,更不用提這種聯機模式對於伺服器的壓力有多大,出於成本考慮也不會是個好的選擇。
結語
由於《集合啦!動物森友會》是個有著本地存檔的單機遊戲這個固有屬性使然,在多人聯機方面需要面臨種種挑戰。希望這篇文章能對大家對於當前動森聯機模式的種種不便給出一個簡單的解答。在這些看似不完善的模式背後,可能也是工程師與開發人員的妥協與無奈。
最後,由於本人對於動森網絡聯機的實際運作機制以及細節並不了解,以上原理是根據對於遊戲運作時展示的特徵,結合相關知識進行的假設。若有錯誤,懇請指教。