ゲームラグ白書 › 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では、一度作ったシェーダーをグラフィックドライバーがシェーダーキャッシュに保存しておき、再利用します。そのため、グラフィックドライバーの更新やゲームのアップデートの直後はこのキャッシュが無効になり、問題なかった人もしばらくまたカクつきます。「アップデート後、初めて行く場所で毎回一瞬止まる」という報告が典型です。
出典 Shader loading Unity シェーダーバリアントを初めて使うとき、グラフィックドライバーがGPU用に生成するため目に見えて止まることがある。一度生成したものはキャッシュされ、再び止まることはない Optimizing Rendering With PSO Caches in Unreal Engine Epic Games パイプラインステート(PSO)を必要になった瞬間に作ると100ms以上かかることがあるため、事前に作っておく必要がある Direct3D 12 Return Codes Microsoft D3D12_ERROR_DRIVER_VERSION_MISMATCH:別のドライバーバージョンで作ったPSOキャッシュは再利用できない(ドライバー更新後は再コンパイル) PresentMon Capture Application (README-CaptureApplication.md) Intel FrameTime(フレーム間のCPU時間)でフレームごとの時間を記録 PSO Precaching for Unreal Engine Epic Games r.PSOPrecache.Validationを有効にすると、stat PSOPrecacheで取りこぼしたPSOの統計を確認でき、ログに「PSO PRECACHING MISS」が記録される。実行時のPSO生成がデフォルトで20msを超えるとヒッチとしてカウント
あわせて読みたい原因
同じ層:L1 クライアントのゲームプロセス
同じ症状(フリーズ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る