ゲームラグ白書 › L1 クライアントのゲームプロセス
時刻同期の誤差 Clock sync error
原因ID cg-clock · 主担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
クライアントが推定したサーバー時刻がずれていると、補間のタイミングやクールタイムの判定がずれます。
なぜ 接続時に一度だけサーバー時刻を合わせ、Pingが変わってもそのまま → すると 補間するタイミング・クールタイムが終わる時刻がサーバーとずれる → 画面では 相手がときどき一瞬止まる。クールタイムが終わったのにスキルが拒否される
- 症状
- カクつき, 不発・ロールバック
- 要因
- 遅延
- 誰に起きるか
- 自分だけ
- いつ
- 長時間稼働するほど, ときどきランダムに
- 担当
- 主担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- 定期的な時刻同期(往復時間を測って補正)、急に変えず徐々に合わせる、経過時間はPCの時刻の代わりにモノトニッククロック(monotonic clock)で計測。
- グラフでは
- 徐々に上昇 · 推定サーバー時刻の誤差
- 確認箇所
- クライアントが推定したサーバー時刻と、サーバーがパケットに入れて送ったサーバー時刻(ティック番号)の差を定期的に記録
- 該当する場合
- 誤差が接続後の時間経過とともに大きくなるか、PCの時計が合わせられた瞬間に一気に跳ね、その頃にスキルの拒否や一瞬止まるという報告が増える
- 該当しない場合
- 誤差が小さいままなのにスキルが拒否されるなら、サーバーの判定・遅延側
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
- もっと詳しく
- 経過時間をPCの日付・時刻(wall clock)で測ると、Windowsがインターネット時刻に合わせて時計を修正したり、ユーザーが時計を変更したりした瞬間に、ゲームの時刻が跳ねます。経過時間は巻き戻らないモノトニッククロック(monotonic clock、Stopwatchなど)で測る必要があります。
出典
- RFC 5905: Network Time Protocol Version 4: Protocol and Algorithms Specification IETF
リクエスト・レスポンスの4つの時刻から、往復遅延と時計のずれを計算する方式 - Acquiring high-resolution time stamps Microsoft
QueryPerformanceCounter(Stopwatchが使用)は外部の時刻と同期しない経過時間用の時計。UTC時刻が必要なときだけシステム時刻を使う - Time synchronization (Netcode for Entities 6.5) Unity
往復時間からサーバー時刻を推定し、時刻を大きく変えずに進行速度を少しずつ調整して合わせる
あわせて読みたい原因
同じ層:L1 クライアントのゲームプロセス
同じ症状(カクつき)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る