ゲームラグ白書 › L1 クライアントのゲームプロセス
float型で持つ時刻の精度低下 Float time precision loss on long sessions
原因ID cg-float-time · 主担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
ゲーム内の時刻を精度の低い小数形式(float)で持っていると、起動したままの時間が長いほど時間分解能(区別できる最小の時間差)が下がり、動きやエフェクトが震えます。
なぜ ゲーム起動後の経過時間をfloatに積算するか、そのままシェーダーに渡す → すると 起動したままの時間が長いほど、floatで表せる最小の差が大きくなる → 画面では 何日も起動したままのクライアントでだけ、キャラクター・アニメーション・流れるエフェクトが小刻みに震え、再起動すると直る
- 症状
- カクつき
- 要因
- ジッター
- 誰に起きるか
- 自分だけ
- いつ
- 長時間稼働するほど
- 担当
- 主担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- 経過時間はdouble(64ビット)か整数で保持、シェーダーに渡す時間は一定周期でリセット、数日間にわたる長時間の自動テスト。
- 数値の目安
- 32ビットのfloatは有効数字が7桁ほどしかないため、起動から1日(約86,400秒)で時間分解能が約8msとなり60FPSの1フレーム(16.7ms)の半分ほど、1週間で約60msとなり1フレームより大きくなります。
- グラフでは
- 徐々に上昇 · 連続起動時間別の震えの報告
- 確認箇所
- 震えの報告と一緒にクライアントの連続起動時間を受け取り、再起動の前後を比較。開発側では、ゲーム開始時刻の値を数日経過した値にして動かすテスト
- 該当する場合
- 何日も起動したままのクライアントでだけ震え、再起動すると消える。起動したままの時間が長いほどひどくなる
- 該当しない場合
- 起動直後から震えるなら「補間バッファがないか短い」か「タイマー分解能」
- 確認手段
- ユーザー側の環境で確認
- もっと詳しく
- オート狩りをオンにしたまま何日も終了しないモバイル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 クライアントのゲームプロセス
同じ症状(カクつき)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る