遊戲 Lag 白皮書 › L1 用戶端遊戲程式
float 時間精度損失 Float time precision loss on long sessions
原因 ID cg-float-time · 主要負責 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
以精度較低的浮點數格式(float)保存遊戲時間時,開著的時間越久,時間解析度(能分辨的最小時間差)就越差,動作與特效會顫動。
為什麼 把遊戲啟動後經過的時間累加在 float 裡,或直接傳給著色器 → 於是 開著的時間越久,float 能表示的最小差距就越大 → 畫面上 只有連續開了好幾天的用戶端,角色、動畫、流動特效會不停顫動,重新開啟就恢復正常
- 症狀
- 卡頓
- 因素
- 抖動
- 誰會遇到
- 只有我
- 何時
- 開越久越嚴重
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 經過時間以 double(64 位元)或整數保存、傳給著色器的時間定期歸零重算、進行連續數天的長時間自動化測試。
- 數值參考
- 32 位元 float 的有效位數只有 7 位多一點,開了一天(約 86,400 秒)時間解析度約為 8ms,大約是 60FPS 一個畫格(16.7ms)的一半;一週則約 60ms,比一個畫格還大。
- 圖表上
- 緩慢爬升 · 依開啟時長統計的顫動回報
- 查看位置
- 收集顫動回報時一併取得用戶端已開啟的時間,並比較重新啟動前後。開發端則把遊戲啟動時間的值設成已經過好幾天的值來測試
- 符合的跡象
- 只在開了好幾天的用戶端顫動,重新啟動就消失,開得越久越嚴重
- 不符合的跡象
- 一開啟就顫動時,是「沒有內插緩衝或緩衝太短」或「計時器解析度」
- 確認方式
- 在玩家端環境確認
- 深入了解
- 在開著自動打怪、一連好幾天都不關的手機 MMO 特別常見。Unity 的 Time.time 也是 float,因此 Unity 另外提供 double 型別的 Time.timeAsDouble,並建議改用它。
出處
- Time.timeAsDouble Unity
Time.time 的 double 版本,開得越久比 float 越精確,大多數情況建議使用 - Floating-point numeric types (C# reference) Microsoft
float 精度約 6~9 位數,double 約 15~17 位數
相關原因
同一層:L1 用戶端遊戲程式
同一症狀(卡頓)在其他層的原因
查看含圖解與實驗的完整版卡片