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

ゲームラグ白書 › 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を別に用意し、こちらを推奨しています。

出典

  1. Time.timeAsDouble Unity
    Time.timeのdouble版。長く起動するほどfloatより精度が高く、ほとんどの場合こちらを推奨
  2. Floating-point numeric types (C# reference) Microsoft
    floatの精度は約6〜9桁、doubleは約15〜17桁

あわせて読みたい原因

同じ層:L1 クライアントのゲームプロセス

同じ症状(カクつき)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る