한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 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,並建議改用它。

出處

  1. Time.timeAsDouble Unity
    Time.time 的 double 版本,開得越久比 float 越精確,大多數情況建議使用
  2. Floating-point numeric types (C# reference) Microsoft
    float 精度約 6~9 位數,double 約 15~17 位數

相關原因

同一層:L1 用戶端遊戲程式

同一症狀(卡頓)在其他層的原因

查看含圖解與實驗的完整版卡片