遊戲中的戰鬥回放的實現原理和機制是什麼?包括即時戰鬥和離線戰鬥。


謝邀。

就大部分遊戲來說,遊戲進程其實就受兩個東西影響。一是用戶輸入,而是隨機數種子。只要把這兩個記錄下來就可以回訪整個遊戲進程了。當然,用戶輸入會被抽象成具體操作,比如在幾分幾秒造了哪個兵。

當然,還有另一個更底層的錄製方法,從API的層面截取視頻音頻流。這在開發工具中比較常用。


把遊戲的邏輯模塊和展示模塊完全隔離開。如果是網路遊戲,那麼邏輯模塊存在於伺服器端,展示模塊存在於遊戲客戶端中;否則,兩個模塊都位於客戶端程序中。

邏輯模塊處理一切的用戶輸入,然後根據用戶輸入判斷遊戲中的每個實體應該播放何種動畫,再將計算的結果傳入展示模塊。

例如,玩家向前移動靠近怪物,並釋放火球術攻擊怪物。那麼邏輯模塊將依次傳輸如下命令至展示模塊:

  1. 時間0s,創建主角,向前移動,速度為1m/s
  2. 時間0s,創建怪物,播放idle動畫
  3. 時間1s,主角停止移動
  4. 時間1s,主角播放釋放法術動畫
  5. 時間1.5s,創建一個火球,速度為10m/s,運動方向為主角到怪物的方向
  6. 時間1.8s,火球停止運動
  7. 時間1.8s,火球逐漸消失
  8. 時間1.8s,怪物轉向主角,朝主角方向移動,速度0.5m/s
  9. ……(自行腦補)

從上可知,展示模塊相當於是一個播放器,由邏輯模塊輸出的命令驅動。為了實現回放的功能,只需要將上述的命令記錄下來,再輸入到展示模塊即可。只不過此時的輸入並不來自於邏輯模塊,而是來自於回放文件。


回合制簡單,記錄用戶操作序列和遊戲隨機種子就好了

實時遊戲fps或者moba,或者rts就要看情況了

rts如果是確定性的,都是定點數運算,隨機種子,邏輯幀驅動,時序確定,那也類似於回合制,記錄操作序列和隨機種子就好了

確定性不強的,那記錄一下計算操作結果,屬性變化也是有必要的

可以看lol的engineer博客,關於確定性的文章

當然如果對結果精確性要求不高的話,簡單記錄,讓遊戲自己去跑,有點偏差也可以接受

還有一種技術 對屬性值關鍵幀做記錄,有款rts 是這麼做的,這樣甚至可以做 遊戲的逆向回放


看著挺複雜,其實關鍵就是一些具體參數,這些參數記錄下來然後根據參數重新模擬戰鬥場面就行了。

程序就是這樣,看起來很複雜,其實關鍵在於你輸入的參數是什麼。


Game Programming Patterns Command 模式


一樣的輸入,一樣的輸出


一種是記錄隨機數種子和操作序列 完全模擬一遍 一種是錄下所有服務端發給客戶端的協議


推薦閱讀:

Cocos Creator 會不會像Cocos Studio一樣半路被停掉?
遊戲項目盈利後沒有給策劃分紅是業內常態嗎,這是否合理?
剛入職unity開發擔心完不成需求,怎麼辦?
分散式的環境下, MySQL和Redis如何保持數據的一致性?
手機遊戲產業中,「開發商」、「運營商」、「渠道商」分別指什麼?

TAG:網路遊戲 | 遊戲開發 | 編程 | 手機遊戲 | 手機遊戲開發 |