ゲームラグ白書 › 症状から探す
カクつき:原因60件と担当
別名:カクカク、引っかかり、スタッター、フレーム落ちのような感じ
図のあるメインページの症状辞典で開く →
動きが滑らかでなく、短く止まっては動くのを繰り返します。
ほかのキャラクターや自分の画面全体が「カクッ、カクッ」と引っかかる。軌跡の点が詰まったり開いたりします。
Ping値に問題がなければ自分のPCのフレーム(クライアント・OS)の問題、PingがばらつくならWi-Fi・回線のジッターの可能性が高いです。ただしゲーム内のPing表示はたいていフレームごとに回るゲームループの中で計測しているため、フレームが跳ねるとPingの数値も一緒に跳ねることがあります。
この症状を引き起こす原因
L1 クライアントのゲームプロセス
- フレームタイムのスパイク: 1フレームの計算に普段の数倍の時間がかかり、画面が一瞬止まります。 (ゲーム開発チーム・クライアント開発)
- クライアントのガベージコレクション: 使い終わったメモリ(ガベージ)を回収する間、ゲーム全体が止まります。一定の間隔でカクつくのが特徴です。 (ゲーム開発チーム・クライアント開発)
- メインスレッドでの同期ロード・シェーダーコンパイル: 初めて見るエリア・モンスター・エフェクトを描画する直前に、ファイルの読み込みやシェーダーの生成を待って止まります。 (ゲーム開発チーム・クライアント開発)
- ストレージが遅くアセットストリーミングが間に合わない: HDDのような遅いストレージでは、オープンワールドのテクスチャ・モデルを読み込む速度が移動に追いつかず、オブジェクトの表示が遅れたり、ゲームが読み込みを待ってカクついたりします。 (ゲーム開発チーム・クライアント開発)
- 大人数の描画負荷: 攻城戦やワールドボスのように数百人が1つの画面に入ると、描画のコストそのものが処理しきれなくなります。 (ゲーム開発チーム・クライアント開発)
- 補間バッファがないか短い: サーバーのパケットを受け取ってすぐ描画すると、ジッター(到着間隔のばらつき)がそのまま画面に表れます。 (ゲーム開発チーム・クライアント開発)
- 過度な外挿(デッドレコニング): パケットが届かない間は最後の速度のまま動かし続けて見せ、外れていたと分かると元に戻します。 (ゲーム開発チーム・クライアント開発)
- 固定タイムステップの追いつき処理の暴走: 一度止まった後、遅れた計算をまとめて処理しようとして、その計算のせいでさらに遅れます。 (ゲーム開発チーム・クライアント開発)
- 時刻同期の誤差: クライアントが推定したサーバー時刻がずれていると、補間のタイミングやクールタイムの判定がずれます。 (ゲーム開発チーム・クライアント開発)
- float型で持つ時刻の精度低下: ゲーム内の時刻を精度の低い小数形式(float)で持っていると、起動したままの時間が長いほど時間分解能(区別できる最小の時間差)が下がり、動きやエフェクトが震えます。 (ゲーム開発チーム・クライアント開発)
- V-Syncとレンダーキュー: GPUが描画したフレームを何枚かキューにためておき、モニターの周期に合わせて出力する間、入力が遅れます。 (ゲーム開発チーム・クライアント開発)
- クライアントのメモリリーク: 長く起動しておくほどメモリが増えてだんだん重くなり、最後にはゲームが強制終了します。 (ゲーム開発チーム・クライアント開発)
- ゲームのセキュリティモジュール(アンチチート)の検査: チートを防ぐためにゲームと一緒に動くセキュリティモジュールが、定期的に検査を行います。検査が重かったり、セキュリティサーバーとやり取りするハートビート(定期的な生存確認の信号)が遅れたりすると、カクついたり切断されたりします。 (ゲーム開発チーム・クライアント開発)
L2 クライアントのOS・端末
- バックグラウンドプロセスによるCPU占有: ウイルス対策ソフトのスキャン、Windows Update、配信ソフト、ブラウザの動画がコアを占有すると、ゲームスレッドがCPUを割り当ててもらえずに待たされます。 (外部・外部)
- 省電力モード・サーマルスロットリング: ノートPCのバッテリーモード、スマホの省電力モード、端末の発熱によって、CPU・GPUの速度が落ちます。発熱の場合は、最初は問題なく、しばらくしてから重くなるのが特徴です。 (外部・外部)
- タイマー分解能: Windowsのデフォルトのタイマーは15.6ms単位なので、「1msだけ待つ」が実際には次のタイマー周期まで、長いと15.6msまで延びます。 (ゲーム開発チーム・クライアント開発)
- セキュリティソフトによるパケット検査: ウイルス対策ソフト・ファイアウォールがすべてのパケットを検査すると遅延が増え、行き過ぎるとゲームを攻撃と誤認してブロックします。 (外部・外部)
- クライアントのメモリ不足・スワップ: ブラウザのタブを数十個開いたままゲームを動かすと、OSがゲームのメモリの一部をディスクに追い出します。 (外部・外部)
- ビデオメモリ(VRAM)不足: グラフィックオプションが必要とするメモリがグラフィックボードのメモリより大きいと、OSがテクスチャをPCのメモリへ追い出してはまた戻すため、カクつきます。 (ゲーム開発チーム・クライアント開発)
- Wi-Fiのバックグラウンドスキャン: OSが周囲のWi-Fiを探すために定期的にチャンネルを切り替えている間、通信が一瞬止まります。 (外部・外部)
- NICの省電力・ドライバーの問題: 有線LANアダプター・Wi-Fiチップがパケットの合間に省電力状態に入ると、再び動き出すまでに時間がかかります。 (外部・外部)
- ウィンドウの最小化・非アクティブ時の処理制限: ほかのウィンドウを見たりゲームを最小化したりすると、ゲームとWindowsが電力を節約するためにゲームの処理を遅くします。戻ると遅れていたパケットが押し寄せるか、すでに切断されています。 (ゲーム開発チーム・クライアント開発)
- オーバーレイソフトの干渉: メッセンジャー・ランチャー・録画・FPS表示のソフトが、ゲーム画面の上に自分のUIを重ねて描くため、ゲームのレンダリング処理に割り込みます(フック)。フレームごとの処理が増え、ときどきゲームとぶつかって一瞬止まったり、ゲームが強制終了したりします。 (外部・外部)
L3 家庭内ネットワーク
- Wi-Fiの干渉・電波の弱さ: 電波が弱かったり干渉があったりすると、無線区間で何度も送り直すことになり、パケットの到着がばらつきます。 (外部・外部)
- Wi-Fiチャンネルの混雑: マンションのようにルーターが数十台ある場所では、同じチャンネルを分け合って使うため、送信の機会を待つことになります。 (外部・外部)
- ルーターの性能不足・過熱: 安価なルーターに数十台の機器、数千の接続が集中すると、ルーター自体が処理しきれなくなります。 (外部・外部)
- モバイル電波の弱さ・不感地帯: エレベーター・地下・建物の奥では、再送が増えて速度が落ち、最終的に切断されます。 (外部・外部)
- 5G↔LTEの頻繁な切り替え(5Gエリアの境界): 5Gの電波が弱い建物の中や5Gエリアの境界では、スマホが5GとLTEを頻繁に行き来し、切り替わるたびにPingが跳ねたり通信が一瞬途切れたりします。 (外部・外部)
L4 インターネット回線
- 衛星インターネット(低軌道・静止軌道): 衛星インターネットは電波が宇宙を往復するため、静止軌道衛星では往復だけで0.5秒を超えます。Starlinkのような低軌道衛星は普段は速いものの、経路を割り当て直す瞬間に遅延が揺れ、一瞬途切れることもあります。 (外部・外部)
- ピーク時間帯のピアリング混雑: 夜9〜11時ごろは動画のトラフィックが急増し、通信事業者間の接続区間(ピアリング)が混雑しやすくなります。 (インフラチーム・ネットワークインフラ)
- ECMP経路のうち1本の不良: 通信事業者やデータセンターは同じ宛先への経路を複数持ち、接続ごとに1本の経路を決めて送ります。1本の経路だけが故障すると、その経路に割り当てられた人だけにラグが出続けます。 (インフラチーム・ネットワークインフラ)
L6 サーバーのネットワークカード
- 仮想化オーバーヘッド・ノイジーネイバー: 同じ物理サーバー上のほかの仮想マシンがネットワーク・CPUを大量に使うと、自分のサーバーの処理が不規則に遅れます。 (インフラチーム・サーバーインフラ)
L7 サーバーOS(カーネル)
- スレッド過多とコンテキストスイッチ: コア数よりはるかに多いスレッドを動かすと、OSがそれらを切り替えて実行するだけでCPUを消費します。 (ゲーム開発チーム・サーバー開発)
- CPUスチール(仮想マシン): 物理サーバー(ハイパーバイザー)が仮想マシンのCPU時間を一時的にほかの仮想マシンに回している間(CPUスチール)、ゲームサーバーが止まります。 (インフラチーム・サーバーインフラ)
- コンテナのCPUスロットリング(CFSクォータ): コンテナにCPU上限をかけると、決まった周期(通常100ms)の中でクォータを使い切った時点から、残りの時間は強制的に止められます(スロットリング)。 (インフラチーム・サーバーインフラ)
- メモリの回収・コンパクションによる停止: OSがヒュージページ(huge page)を作るためにメモリをコンパクションしたり、空きメモリを回収したりしている間、プロセスが止まります。 (インフラチーム・サーバーインフラ)
- 定期実行ジョブ: 毎日同じ時刻に動くログ圧縮・バックアップ・セキュリティスキャンが、CPUとディスクを占有します。 (インフラチーム・サーバーインフラ)
- OS・カーネル・ドライバー・ファームウェアのアップデート後の性能変化: ゲームのコードは変わっていないのに、サーバーのOS・カーネル・ドライバー・ファームウェアをアップデートしてから遅くなるケースです。アップデートによって、デフォルト値、スケジューラー、CPU脆弱性の緩和策(mitigations)、ドライバーの動作が変わることがあります。 (インフラチーム・サーバーインフラ)
L9 サーバーのゲームプロセス
- ティックバジェット超過: 1ティックの処理がバジェットを超えるとサーバーのティック周期が延び、そのエリア全体がゆっくり進んだりカクついたりします。 (ゲーム開発チーム・サーバー開発)
- 視界(AOI)計算の急増(N²): 誰が誰を見られるかを全員同士で比較すると、人数が10倍になったとき計算は100倍になります。 (ゲーム開発チーム・サーバー開発)
- ゲームスレッドの同期呼び出し: ティックの途中でDBの応答やファイルの書き込みを待つと、その時間だけサーバーのゲーム進行全体が止まります。 (ゲーム開発チーム・サーバー開発)
- タイマーの一斉発火: すべてのモンスターのリスポーン、すべてのバフの期限切れ、毎正時の報酬が同じティックに集中すると、そのティックだけ処理が数十倍重くなります。 (ゲーム開発チーム・サーバー開発)
- オブジェクトの蓄積(消えずに残るアイテム・召喚物): 消えるはずの地面のアイテム、召喚物、終わったタイマーが片付けられずにたまると、サーバーを長く稼働させるほど毎ティックの処理が増えます。 (ゲーム開発チーム・サーバー開発)
L10 メモリ
- スクリプトエンジンのGC停止: C++のサーバーでも、クエスト・AI・スキルをLuaなどのスクリプトで動かしていると、スクリプトエンジンのGCが走っている間そのゾーンが止まります。 (ゲーム開発チーム・サーバー開発)
- アロケーションの急増: イベント中に一時オブジェクトを大量に生成すると、GCが普段よりはるかに頻繁に走ります。 (ゲーム開発チーム・サーバー開発)
L11 ディスク
- 同期ログ書き込み: ゲームスレッドがログを1行書くたびにディスクへの書き込み完了を待っていると、ディスクが忙しいときにゲームの進行も一緒に止まります。 (ゲーム開発チーム・サーバー開発)
- fsyncの集中: データを「確実に」ディスクに書き込むよう要求すると、ディスクによっては1回に0.1ms〜数十msかかり、要求が集中するとキューが長くなります。 (ゲーム開発チーム・サーバー開発)
- クラウドディスクのバーストクレジット枯渇: 一部のクラウドディスクや小さなサーバースペックには、一時的にベースラインより速く使えるバーストクレジットがあります。忙しい時間が長引いてクレジットが底をつくと、速度が急に落ちます。 (インフラチーム・サーバーインフラ)
- バックアップ・圧縮・スキャン処理: 深夜のバックアップ、ログの圧縮、セキュリティスキャンがディスクを独占すると、ゲームサーバーの読み書きが詰まります。 (インフラチーム・サーバーインフラ)
L12 データベース
L13 サーバー構成と運用
- ログ・監視の過負荷: 障害が起きるとログが急増し、ログを同期で送るサーバーはログのせいでさらに遅くなります。 (ゲーム開発チーム・サーバー開発)
同期設計
- ロックステップでの最も遅いプレイヤー待ち: 全員が同じターンを一緒に計算する構造では、1人の入力が遅れると全員が待たされます。 (ゲーム開発チーム・サーバー開発)
- タイムスタンプなしの受信即時再生: サーバーのイベントに発生時刻を付けず、受け取ったらすぐに再生すると、ネットワークのジッターがそのまま演出のタイミングのばらつきになります。 (ゲーム開発チーム・クライアント開発)
- ホスト(部屋主)型の構成: 1人のプレイヤーのPCがサーバーの役割をすると、その人の回線とPC性能が全員の体感を決めます。 (ゲーム開発チーム・サーバー開発)
- 低いスナップショット送信レート: サーバーが位置の更新(スナップショット)を1秒に数回しか送らないと、その分だけ補間バッファを長く取る必要があり、ほかのキャラクターをより遠い過去の姿で見ることになります。 (ゲーム開発チーム・サーバー開発)
一部のユーザーだけに起きる問題
- プレイヤーごとの入力バッファのサイズ: サーバーが人ごとに入力を少しためておき、1ティックに1つずつ取り出して使うと、ほかの人の目にはなめらかですが、本人の行動がサーバーで確定するタイミングはその分遅れます。 (ゲーム開発チーム・サーバー開発)
- モンスターの制御権が遅いクライアントにある: サーバー負荷を減らすため、モンスターの移動計算を近くのプレイヤー1人のクライアントに任せるゲームがあります。その人の回線が悪いと、そのモンスターが全員の画面でおかしな動きをします。 (ゲーム開発チーム・サーバー開発)
- メモリ・VRAM不足によるストリーミングの失敗: 2つのクライアントがビデオメモリを分け合うと、新たに必要なモデル・テクスチャを載せる場所がなく、一部が描画されません。 (ゲーム開発チーム・クライアント開発)
- 時刻推定の誤差によるオブジェクトの保留: クライアントが推定したサーバー時刻がずれていると、届いたばかりのオブジェクト情報を「まだ未来」として保留したり、「古すぎる」として破棄したりします。 (ゲーム開発チーム・クライアント開発)
TCP再送の根本原因
- 順序の入れ替わりによる不要な高速再送: 複数の経路や束ねたリンクを通る間にパケットの順序が入れ替わると、受信側が重複ACKで「抜けたパケットがある」と知らせ、送信側は問題のないパケットを送り直します。 (インフラチーム・ネットワークインフラ)
図のあるメインページの症状辞典を見る