浮点数与定点数问题
在MOBA項目開發過程中,LFIXED類中定義了許多浮點轉定點的常量。
這個類用了很久,以往的同步測試中也沒有因為這些常量的使用產生過不同步問題。
然而,總覺得哪里不安全,想了很久,終于把長久以來的疑問想清楚了:幀同步游戲中浮點數為什么不安全,如何做才能安全(同步)?
對于任何一個浮點數,在不同硬件上可能數值不同,產生不同的原因是什么?
是不同硬件的算法不同嗎?不是。
所有硬件都是按照浮點數的通用算法存儲的,比如 0.1,
0.1f?轉換為二進制的方法是不斷乘2取整數部分,直到精度達到要求(并對后面的一位四舍五入)。
產生不同數值的原因就在精度問題,不同機器的精度不同時就產生了不同的數值。
由以上原理論知:像0.5,0.25,0.125這樣 (1/2)的N次方的數值不會產生精度不同問題,因為它們能在精度范圍內存儲,
但超出精度存儲范圍的(1/2)的N次方的小數也可能會有問題的,如? (1/2)的24次方
?
其實幀同步游戲中用到的浮點數常量并不多,可以先一臺機器上算出需要用到的浮點常量對應的定點數,存儲到文件中,運行加載出來。
運行其間可能會用到浮點數,比如求兩個數值的比例,這時候的解決辦法是? A*1.0F/B ,其中A,B是定點數
至于走路同步問題,游戲啟動時,各英雄位置是從文件中讀取的定點數,因此保證了英雄初始位置各機器同步。走路過程中,服務器只廣播方向(定點數),各端根據定點數速度和轉向算出新位置,這樣英雄每走一步后,其位置在各機器也是同步的
?
總結