【面經】騰訊U3d面試面經 幀同步方向 (一)幀同步如何解決不同步的問題?

解決不同步問題首先考慮什麼是不同步的問題,爲什麼會出現不同步的情況。

那麼什麼是不同步的問題呢?幀同步是由客戶端計算,發送命令給服務器,服務器轉發命令達到兩邊客戶端顯示一致。服務器是不知道具體邏輯的,所以如果兩邊客戶端計算的某些變量出現不一致的時候,就會出現不同步的情況,隨着時間的推進,一個小小的不同步也會造成滾雪球效應,最後的結果可能就南轅北轍了。

所以爲什麼會出現不同步的情況,也很好解釋了,兩邊客戶端無法保證輸入的一致性,計算的一致性,就無法保證唯一的輸出。

首先,一個戰鬥系統的可玩性很大的一點是戰鬥的傷害具有隨機性,幅度會在一定範圍內隨機顯示,然後還有機率出現暴擊;而幀同步的特性就是要消滅這樣的隨機性,兩邊客戶端在同一時間計算出來的傷害一定是一個數字。那麼如何控制這個隨機性呢?通過服務器在幀同步開始的時候下發同一個隨機數種子,通過自定義的隨機數算法保證這個數字看上去是隨機的,但是實際上是必然的。

其次是計算過程中的精度損失,最爲關鍵的就是浮點數導致的精度損失,在不同的硬件環境下,相同的浮點數可能會造成不同的運算結果,雖然這個結果在這一幀內影響有限,但是由於滾雪球效應,最終的戰鬥結果可能就會出現非常明顯的不同步問題了。對於這個問題,採用定點數去代替浮點數做計算,使用一個萬分比的參數去轉換定點數和浮點數,這樣就能避免規避掉浮點數的問題。

然後是邏輯順序執行不一致,這個一般是由於使用到了一些插件,而這些插件的Update並不能由幀同步去控制,導致兩邊客戶端可能執行某個計算片段的時間並不是在同一邏輯幀,所以解決這個問題的方案就是,不要使用這些插件,儘量去使用開源插件或者自己寫,保證Update函數掌控在自己的邏輯中,去避免出現不同步的問題。例如物理系統、動畫系統、AI等這些插件,就儘量去使用自己寫的,保證一致性。

然後是網絡接收數據的先後順序不一致的不同步問題,通常的幀同步爲了保證網絡的流程,會丟棄掉成熟的TCP,採用UDP去自行實現可靠的網絡收發,但是如果一旦不考慮清楚網絡的複雜性,就會出現網絡波動的情況下,後發的消息可能會比先發的消息先發送到接收端,如果這時候接收端不進行處理的話,就會出現接收端先處理後一條消息,再處理前一條消息的情況,這樣輸入的順序不一致,也是會造成最終的不同步的。解決方法也很簡單,對每一個發出的消息做一個自增的編號,根據編號的連續性確定消息的順序,就算先收到後面的消息,也可以等待前面的消息收到之後進行順序傳入遊戲邏輯中。

總結來說,就是保證客戶端的輸入一致,計算一致,就能解決幀同步的不同步問題。

最後,一個優秀的幀同步系統,首先應該儘量去避免不同步的問題,其次就是在出現不同步問題的時候,能快速查找出問題的根源,然後去解決問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章