《守望先鋒》死亡鏡頭回顧是如何實現的?


我沒有對《守望先鋒》進行反工程,在此只嘗試說一下基本原理和猜想。

遊戲回放的功能,可類比資料庫備份和還原。

簡單的做法是備份每幀的完整狀態,然後逐幀還原狀態來回放。但如果遊戲的狀態數據很多,除了存儲數據大,存儲過程也會影響性能。

第二種做法是記錄狀態的變更,用資料庫的術語就是事務日誌(transaction log)。在 C/S 架構下,可通過記錄發出及收到的網路包信息來存儲對遊戲狀的變更。在回放時重新執行這些信息,來改變每幀的狀態。

然而,上一種做法不能快速跳到遊戲中任意時間,往更早的時間需要從頭開始回放。這並不適合死亡回顧這種需求。我們可以結合以上兩種方法,像資料庫備份策略一樣,每隔一段時間做完整備份,然後每幀記錄狀態變更,那麼就可以快速跳到離目標最近的完整還原點,然後再快速地執行變更,以到達回放的起始時間。

遊戲的回通常放並不要求完美地還原,所以所謂的完整備份也只需要記錄一些關鍵狀態,如所有角色、拋射物的位置、坐向、動畫狀態等。而 C/S 的網路包除了同步玩家的指令,通常也會同步一些關鍵狀態。所以估計以 C/S 同步方案而言,如果網路包含有足夠的關鍵狀態,那麼也可以只存儲這些網路包的信息做回放功能。


如果不是特別要求真實性的話,反正打遊戲的時候都會通過保存metadata來做回放錄像的數據的,只要用我方數據上的對方的視角來渲染一遍就好了。


暴雪在WAR時代就有錄像功能了。

半個多小時的錄像就只有幾百KB大小。

其實文件里並不是視頻,其實是腳本。。。

個人感覺和OW差不多,都是記錄動作數據啊之類的然後直接套用遊戲客戶端進行回放。

再說了,視頻回放功能很多遊戲都有,比如COD系列和戰地系列。

大概都是這樣的。


反正並不是完全相同的畫面。好幾次我都看出來我死的時候和後來死亡回放的畫面並不完全相同。

比如我明明被炸出了非常遠死掉了,死亡回放里卻是炸在原地死掉的


這個簡單,每一次比賽的時候,本地都是要接收伺服器信息才能知道別的玩家做了什麼,我的角色又有哪些行為被伺服器確認了,這種記錄操作的數據列表容量很小,幾乎不佔帶寬和性能,等到要回溯的時候直接讀取前幾秒的列表重現即可。


服務端數據下載後從客戶端重新生成的,暴雪說過


用一個列表記錄每個角色的動作,回放的時候從那個時間節點再現一次

ps,由於fps遊戲需要在客戶端先進行各種判定(比如有沒有被擊中),然後把判定結果傳回伺服器(比如受到多少傷害),所以這個列表幾乎是必須的


deathcam/killcam 這個主要看引擎實現

其實對守望來說,本身網路遊戲它就要同步各個玩家數據,只需要將前面若干幀的數據拿出來重放就行

不過這是我猜測的做法,而且實現起來各種細節會非常討厭,譬如往前回滾到多少開始播放,是否有之前狀態遺留的影響等……


同意輪子哥 @vczh的觀點,死亡鏡頭其實是動作復現,例如魔獸爭霸3,錄像文件肯定不會是個視頻,而是所有對象的動作過程記錄,回放錄像其實就是開了個新圖,並以錄像文件中保存的動作記錄和其他數據重新跑一場遊戲,有點類似於PS的像素(錄像視頻)和AI的矢量(動作記錄)的概念。在守望先鋒里應該就是從死亡時間點向前計算出死亡鏡頭起點時間,從這裡開始回放可視範圍內(也可能是整幅地圖)的玩家動作過程,並將攝像頭鎖定在對方角色身上,將這段過程渲染出來就成了死亡鏡頭回放。


其實……你們有沒有發現

如果我玩守望先鋒平均幀數15幀,在播放死亡回放的時候,還是非常卡的15幀……

說明守望先鋒的死亡回放基本上不可能是視頻……因為在其他遊戲中,如果進入到提前錄製好的視頻動畫中的話,FRAPS會顯示瞬間飆升到60幀以上(實際上並沒有這麼多…)

——一個低配玩家的血淚


說一下風暴英雄。。。比較直觀

風暴英雄有錄像功能,雖然大多數人應該不會用。。。

這是數據文件

看右下角,三百多文件才不到60M。。所以肯定不是視頻了。。

我點開了一個錄像

直接拉到遊戲時間中間,處於重新定位狀態,打開實時網速軟體

沒有明顯下載數據,說明錄像回放都是基於本地的。

所以,此類視頻回放應該都是提取本地操作數據,再用遊戲再現的,全場最佳因為第一視角需要本地上傳,估計需要消耗少量流量。


1.fps的數據是全局的(也就是說所有人的電腦上都有所有人的數據)

2.保留數據包在一個緩衝區。(數據包也就是遊戲戰報,只要不丟失玩家,那麼戰報理論上就等於遊戲錄像,至於壓縮和減少數據量不在此討論範圍。)

3.有了遊戲錄像,回放,小功能而已。


電腦記錄

a站在門口

b站在路上

圍觀者cdefg分布在車旁邊這裡這裡這裡這裡和這裡

a從門口跑到了車旁邊

b丟了個劇毒詭雷然後開鏡開了一槍

cdefg在做表情

你是a,被b狙死了

電腦發現你是被b打死的

於是按照b的第一人稱視角渲染上面那段數據

=============

夠通俗易懂不…………


坦克世界也有回放,生成的是一個腳本文件,執行時會根據一局下來各個玩家的空間坐標,炮口方向等等數據來還原當場戰役,所以文件都不大

估計守望也是這樣吧


死亡瞬間到死亡回放結束,網路流量平穩,下行流量在90Kbps左右,與正常遊戲時無明顯區別。

戰鬥結束到播放全場最佳畫面間幾秒動畫時間出現1600到1800Kbps的下行流量。

未嘗試限制網速觀察無法及時獲取最佳畫面情況下表現。

推測客戶端會保存一段時間的敵我動作數據用於死亡回放。

但全場最佳數據由伺服器存儲。

以上僅僅是推測,真正怎麼實現還得等暴雪的程序員,不過我想這應該在保密協議里吧2333


看了上面說了那麼多,作為一個網路並不是很好的用戶說一句:如果在網路很差的情況下,死亡後不會有回放,所以他的回放應該是基於擊殺你的人傳輸數據到你的本地電腦然後再進行回放;這個數據應該很小


忽略掉操作者本人的客戶端預演(比如你網路不好,麥克雷扔手雷,扔出去幾幀後發現並沒有扔出去,扔出去這個動作就是本地預演,而由於網路差沒有同步給別人,所以伺服器讓你把手雷收回去。所有這段內容回放你是看不到的,你有可能在回放里就是單純的發獃),整個戰鬥都是來自伺服器發送的數據來驅動客戶端表現的,所以回放這段內容,伺服器再發相同數據或者客戶端自己記錄下一段時間內的數據,在需要播放的時候播放就可以了


死亡回放是個比較有年頭的設計了,具體實現按照使用的遊戲引擎的不同而不同。


肯定不是錄屏,因為我偶爾能遇到一些人物模型沒渲染出來的情況,全場最佳也遇到過,這麼說來暴雪應該採用了數據實時錄製的方式,包括人物位置準星朝向射擊等數據,當擊殺發生後,檢索擊殺前幾秒的數據以擊殺者視角進行渲染,所以有時候渲染不及時會出現沒有模型的情況


樓主可以搜索 Lockstep Simulation 可知一二~

我和基友們做了個類似War3的Replay的示例遊戲,不介意翻牆的話可以在這裡看看效果:Game2Fun | Focus on game design graphics technology research

裡面的2段視頻,1個是遊戲模式,1個是復盤模式。各種特性的技能種類,復盤支持變速。

實際上做起來的時候,各種坑還是多,細節不表了~


推薦閱讀:

無主之地系列的畫面是什麼風格的?
哪款網遊很有特色且運營時間很長直到今天還在運營?
國產單機遊戲為什麼需要玩家同情?
為什麼知乎上關於遊戲設計的話題在2016年後變得這麼冷清?
拳皇裡面換色是怎麼實現的?

TAG:遊戲 | 遊戲設計 | 電子競技 | 守望先鋒? |