2011-11-20 46 views
2

我們正在構建支持重播的多人遊戲。重播的工作是這樣的:我們如何看待多人遊戲重放?

來自服務器的所有狀態更新被保存到文件中。當我們重播文件時,我們只需從服務器接收到初始狀態並應用狀態更新。這工作正常。我們可以發揮,快速前進,暫停和去吧......哦,等等。

實際上允許玩家向後查看重播的最佳方式是什麼?


一些實現細節,我們使用一個巨大的狀態結構(好吧,不是真的,但你可以看到它)。通過計算最後發送的結構和當前結構之間的差異,通過網絡(UDP)更新此結構。客戶端在最後兩個接收到的結構之間進行插值,並在需要時進行外推(當ping>更新節流時)。另外,我們使用acked事件系統來處理那些不能在屏幕上順利繪製的東西,但是需要做到這一點。

+0

你可以計算最後一個狀態,然後把所有以前的狀態作爲最新狀態作爲初始狀態?也許我誤解了這個問題。 – beta0x64

+0

你是否在每個狀態之間存儲整個狀態或每個狀態之間的增量? – Justicle

+0

看起來像增量 – beta0x64

回答

1

一些建議(假設您可以在任何時候創建一個快照,並且您正在存儲前向增量)。

1.如果重放時間短,狀態不是很大,實際上會爲序列中的每個幀生成快照並將其「渲染」爲相反。

2 ..如果整個狀態非常大,那麼只會爲反向重放的最後一幀生成快照。然後將X前向增量應用於快照,以生成反轉重播的第一幀。渲染。然後應用X-1增量,然後渲染,直到X = 0,重播結束時(只是第一個快照)。

// pseudo code for reverse play 
first, last = GetReplayRange(); 

if (playReversed) { 
    GameState snapShot = GenerateSnapshot(first); 
    GameState currentState; 

    currentFrame = last; 
    while (currentFrame != first) { 
    // loop from snapshot up to current frame 
    for (i = first; i < currentFrame; i++) { 
     currentState = snapShot.AddDetlasTo(currentFrame); 
    } 
    Render(currentState); 
    currentFrame--; 
    } 
} 

3 ..如果它的速度太慢,X更新適用於快照,「倒帶」,然後進行一系列的花絮N幀分開,並做相同的反向把戲#2,在較窄的範圍內。

請記住,即使您已準備好呈現顛倒的遊戲狀態 - 您仍然必須呈現所有效果相反的效果,這些效果系統可能不適合使用。