本文首發“遊戲開發那些事”
作者:Jerish
回放系統,是電子遊戲中常見的一項功能。通過回放,我們可以觀摩高手之間的對決,重複享受遊戲中的精彩瞬間,甚至還可以拿到敵方玩家的比賽錄像進行分析和學習。總的來說,回放功能常用于記錄整個比賽的過程細節或者展示遊戲中的精彩瞬間,非常貼合競技類遊戲玩家的需求。
從實現技術角度來講,下面的這些功能本質上都屬于回放的一部分:
彩虹6号中的擊殺回放
守望先鋒中的完整比賽回放
其實早在20世紀90年代,回放系統就已經誕生并廣泛用于即時戰略、第一人稱射擊以及體育競技等類型的遊戲當中。
回放系統的錄制方式
當我們打開CSGo或者Dota回放文件夾的時候會發現這些回放的文件并不大,一場比賽下來最多也就幾十兆,遠小于對應時長的視頻,那麼回放到底是如何實現的呢?
Dota錄制文件大小,打開後一般是亂碼
通常來說有三種方式,我們會逐一的展開來講:
第一種,逐幀的錄制遊戲畫面。就像現實中體育賽事用攝像機捕捉現場畫面那樣,我們可以遊戲渲染的時候直接從底層抓取畫面信息來持續的生成一個視頻流文件,然後通過任意的一個視頻播放器都進行解析和回放。
優點:
缺點:
一般來說,由于存儲空間以及各種性能問題,錄制遊戲畫面方式幾乎不會被用于遊戲開發中。
實況足球比賽回放(可以任意調整視角)
第二種,逐幀錄制玩家的輸入操作。其實遊戲本身就是一個可視化的軟件程序(或者說是一個渲染器),每一時刻的畫面都是通過玩家的操作邏輯來驅動的。在考慮遊戲内進行回放的情況下(比如死亡回放),我們完全沒有必要去錄制冗餘的畫面信息,隻需要記錄玩家的輸入信息然後去驅動遊戲邏輯改變畫面就可以了。
錄制幀輸入,回放時按照時間觸發這些指令信息即可
優點:
缺點:
通常來說,這種實現方式可以完美的利用遊戲邏輯去進行回放,而且消耗非常小。對于幀同步(LockStep)的網絡遊戲,不需要額外做太多的工作,适合性能要求嚴格、物理計算不太需要同步的RTS、MOBA、FTG等類型遊戲。
有了玩家輸入信息我們可以較好的向前推進遊戲流程,但是卻很難執行倒退、向前跳躍等操作。舉個場景,假如玩家A在第10幀點擊攻擊按鈕擊殺了一個AI并回複了5點生命值,第20幀點擊武器制作按鈕制作了一把新的武器但是同時由于被敵人擊殺而掉落。
如果回放時想從第50幀跳回到第5幀的畫面,那麼就需要把玩家A複活,新創建的武器删掉,扣掉恢複的生命并複活AI。按照上述的第二種方案我們在隻記錄玩家的輸入信息【5幀:攻擊按鈕 20幀:制作按鈕】的情況下,幾乎不可能順利還原所有邏輯。根本的原因是,遊戲很容易根據當前的場景和玩家輸入推算出下一幀的結果,卻很難根據當前一幀的結果和玩家輸入推算出上一幀的遊戲狀态。
除此之外,我們需要保證任何一個操作都必須有一個回滾的邏輯并且不同播放端回滾後的結果是嚴格一緻的的,這些都都遠遠增大了跳躍播放的難度。
因此,我們可以考慮第三種方案,定時記錄玩家以及遊戲世界的狀态信息(或者說遊戲快照)。所謂的狀态信息就是某一時刻的對象身上附帶的狀态信息,比如玩家的生命值、移動位置等。如果我有了每一幀玩家的坐标信息,我就可以完美的處理播放、快進、跳躍等邏輯,但很明顯這樣要記錄的數據要多很多。
Dota中的回放,錄制狀态信息
優點:
缺點:
總的來說,回放的本質是記錄遊戲的過程信息,畫面是最終的表現效果。為了更好的利用遊戲程序本身提供渲染功能和邏輯計算功能,同時從性能、數據量、自由度等多角度考慮,我們通常會根據遊戲的類型來選擇第二種或者第三種方案來實現遊戲内部的回放系統。
回放系統與網絡同步
通過上面的描述,我們很容易發現,回放系統的實現邏輯與網絡同步非常相似。從原理上來講,我們完全可以認為網絡同步是實現回放系統的技術基礎,上面第二種方案對應的就是網絡同步中的“幀同步(LockStep)”技術,第三種方案對應就是網絡同步中的“狀态同步”技術。
雖然大家常把網絡同步可以簡單分為幀同步和狀态同步,但實際上這兩個概念是國内開發者不斷摸索和自創的名詞,并非嚴格指某種固定的算法,他們有很多變種,甚至可以結合到一起去使用。
在如今的遊戲中,狀态同步是比較流行的實現方式,也可以比較好支持回放的各種功能(比如吃雞、守望、彩六等)。但是如果頻繁的錄制整個世界的快照會導緻消耗非常大,所以通常會采用定時錄制快照 持續錄制Delta的方式進行處理,簡單來說就是每隔一段時間錄制一個存檔點(稱為Checkpoint),每個存檔點之間持續的錄制Delta數據(變化的狀态信息),每次加載回放的時候都先找到合适的存檔點,然後再通過讀取中間的Delta數據快進過去。
Checkpoint Delta方案示意圖
Unreal的回放系統就是按照上面的方式實現的,可以比較好的支持快進、跳轉、暫停等大部分回放功能,我會在下一篇文章中詳細的分析虛幻引擎回放系統的實現原理,盡請期待!
UE中的回放錄制命令
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!