因此在需要即時性的環境中,必須要保證執行命令不只在順序上同步,也要在時間上同步。實作方式也許可以讓server 無論有無收到參予者的執行命令,都要按時傳送執行命令串給client 端,client 端要在協定的時間內取得server端傳來的執行命令,如果沒收到server端的命令串則凍結即時環境的運行直到收到命令串。如此所有參與者能在相同delayT時,執行命令串。接著client 再傳個"命令已經正確被執行"的回覆給server,server 收到所有client的回覆後,才算完成這一輪的傳輸,同樣的,如果沒收到所有 client的回覆,就得凍結即時環境的運行直到收到所有回覆。在server 的即時環境的運行被凍結時,client 端會因為收不到server 傳來的下一輪命令串而同樣得凍結即時環境的運行。為了避免無止盡的等待,在等待時加入timeout機制來限制等待時間。
以上描述可以下圖表示,每一個參予者的每一次執行命令迴圈由三部份組成:
- 等待m 個frame。client 以m 個frame的緩衝時間接收命令串。
- 執行命令串。
- 等待n 個frame。server 以n 個frame的緩衝時間接收所有client 的回覆(reply)。
如果超過等待時間,沒取得該收到的資料,則會進入凍結環境的狀態(frozen game world)。如果再過一段時間還是沒收到資料(timeout),則進入處理斷線的程序。
上圖只是初步的構想,也許有其他更簡潔的傳輸協定方式來達成在即時性環境中的執行命令同步。
在更單純如回合制的環境下,server-client 的傳輸機制將會更簡單。這部份的討論留待將來再進行。
----


沒有留言:
張貼留言