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

ゲームラグ白書 › L1 クライアントのゲームプロセス

メインスレッドでの同期ロード・シェーダーコンパイル Synchronous asset load, shader compile

原因ID cg-sync-load · 主担当 ゲーム開発チーム・クライアント開発

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

初めて見るエリア・モンスター・エフェクトを描画する直前に、ファイルの読み込みやシェーダーの生成を待って止まります。

なぜ 新しいエリアへの進入、初めて見るスキル・装備・モンスターの登場 → すると メインスレッドがファイルの読み込みとシェーダーコンパイルを待つ → 画面では 初回だけ0.1〜1秒止まり、2回目以降は問題ない

症状
フリーズ, カクつき
要因
ストール
誰に起きるか
自分だけ
いつ
移動中・マップ切り替え時, 特定の操作をしたとき
担当
主担当 ゲーム開発チーム・クライアント開発
ゲーム開発チームの対応
非同期ロード、事前読み込み(プリウォーミング)、シェーダーをロード画面や初回起動時に事前コンパイル、ロード画面の活用。
数値の目安
シェーダー1つのコンパイルに数十ms、長ければ100ms以上。テクスチャの読み込みはストレージの速度によって数十〜数百ms。
グラフでは
接続直後・メンテ明けに急増 · フレームスパイクの回数(アップデート・ドライバー更新の直後)
確認箇所
PresentMonで同じルートを2回記録し、初回と2回目を比較。開発ビルドでは、Unrealでr.PSOPrecache.Validationを有効にしてstat PSOPrecacheとログの「PSO PRECACHING MISS」を、UnityではプロファイラーのTimelineで跳ねたフレームのロード・シェーダーの区間を確認
該当する場合
初めて行く場所・初めて使うスキルでだけ0.1〜1秒跳ね、2回目には消える。アップデートやグラフィックドライバー更新の直後に報告が集中し、その後減る
該当しない場合
同じ場所で毎回跳ねるなら、シェーダーキャッシュの問題とは別。ストレージが遅いPCでだけ移動のたびに繰り返すなら「ストレージが遅くアセットストリーミングが間に合わない」、専用GPUメモリがいっぱいなら「ビデオメモリ(VRAM)不足」
確認手段
ゲームサーバー・クライアントのログ・メトリクスが必要
もっと詳しく
PCでは、一度作ったシェーダーをグラフィックドライバーがシェーダーキャッシュに保存しておき、再利用します。そのため、グラフィックドライバーの更新やゲームのアップデートの直後はこのキャッシュが無効になり、問題なかった人もしばらくまたカクつきます。「アップデート後、初めて行く場所で毎回一瞬止まる」という報告が典型です。

出典

  1. Shader loading Unity
    シェーダーバリアントを初めて使うとき、グラフィックドライバーがGPU用に生成するため目に見えて止まることがある。一度生成したものはキャッシュされ、再び止まることはない
  2. Optimizing Rendering With PSO Caches in Unreal Engine Epic Games
    パイプラインステート(PSO)を必要になった瞬間に作ると100ms以上かかることがあるため、事前に作っておく必要がある
  3. Direct3D 12 Return Codes Microsoft
    D3D12_ERROR_DRIVER_VERSION_MISMATCH:別のドライバーバージョンで作ったPSOキャッシュは再利用できない(ドライバー更新後は再コンパイル)
  4. PresentMon Capture Application (README-CaptureApplication.md) Intel
    FrameTime(フレーム間のCPU時間)でフレームごとの時間を記録
  5. PSO Precaching for Unreal Engine Epic Games
    r.PSOPrecache.Validationを有効にすると、stat PSOPrecacheで取りこぼしたPSOの統計を確認でき、ログに「PSO PRECACHING MISS」が記録される。実行時のPSO生成がデフォルトで20msを超えるとヒッチとしてカウント

あわせて読みたい原因

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

同じ症状(フリーズ)を起こすほかの層の原因

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