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

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

ストレージが遅くアセットストリーミングが間に合わない Slow storage stalls asset streaming

原因ID cg-asset-stream · 主担当 ゲーム開発チーム・クライアント開発 · 副担当 外部・外部

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

HDDのような遅いストレージでは、オープンワールドのテクスチャ・モデルを読み込む速度が移動に追いつかず、オブジェクトの表示が遅れたり、ゲームが読み込みを待ってカクついたりします。

なぜ 乗り物・テレポートで高速に移動したり、人が多い場所に入ったりして、新しいテクスチャ・モデルが一気に必要になる → すると HDDのような遅いストレージが必要な速度で読み込めず読み込み要求がたまり、一部のロードはメインスレッドが完了まで待つ → 画面では テクスチャがしばらくぼやけ、建物・キャラクターの表示が遅れ、読み込みを待つ瞬間にカクつき・フリーズ

症状
表示されない・ゴースト, カクつき, フリーズ
要因
ストール
誰に起きるか
自分だけ
いつ
移動中・マップ切り替え時, 人が集中したとき
担当
主担当 ゲーム開発チーム・クライアント開発 · 副担当 外部・外部
ゲーム開発チームの対応
読み込みをメインスレッドで待たない非同期ストリーミング、移動方向・速度に基づく先読み、低解像度(ミップマップ)・簡易モデルを先に表示して後で差し替え、高速移動中にストリーミングが遅れたら一時的に移動速度を制限するかロード画面を使用、最低・推奨スペックにSSDの要否を明記。
外部の対応
ユーザーにゲームをSSDにインストールするよう案内、同じディスクでダウンロードやウイルス対策ソフトのスキャンが動いていないか確認するよう案内。
数値の目安
Microsoftの説明によると、以前のハードディスクは1秒に数十MB、NVMe SSDは1秒に数GBを読み込み、前世代のゲームはストリーミングに1秒あたり50MB前後を使っていました。SSDの速度を前提にこれよりはるかに多く読み込むゲームをHDDで動かすと、読み込みが移動に追いつかなくなりがちです。
グラフでは
一部だけ高い · フレームスパイクの回数(ストレージの種類別)、ディスク読み込みの遅延
確認箇所
Windowsのパフォーマンスモニターで、PhysicalDisk\Avg. Disk sec/Read(読み込み1回の平均時間)・Current Disk Queue LengthとPresentMonのフレームタイムを、高速で移動しながらあわせて記録。開発ビルドではUnrealのstat Streaming・stat AsyncLoad、UnityプロファイラーのAssetBundle.asset/allAssets警告(ロード完了前に結果を要求し、メインスレッドが待つ)を確認
該当する場合
高速で移動するとディスク読み込みの遅延とキューが急上昇し、同じ時刻にフレームが跳ねたり、テクスチャ・オブジェクトの表示が遅れたりする。同じ場面をSSDで動かすと消える
該当しない場合
ディスクの負荷は低いのにテクスチャがぼやけるなら「ビデオメモリ(VRAM)不足」、同じ場所への2回目の訪問から問題なければ「メインスレッドでの同期ロード・シェーダーコンパイル」
確認手段
ユーザー側の環境で確認
もっと詳しく
初回だけ止まって次から問題ないなら「メインスレッドでの同期ロード・シェーダーコンパイル」に近く、ストレージが遅いPCでだけ移動のたびに繰り返すならこの原因です。ビデオメモリが足りずテクスチャを退避させては読み戻す「ビデオメモリ(VRAM)不足」もテクスチャのぼやけを起こすため、ディスクの読み込み待ちとビデオメモリの使用量をあわせて確認します。ウイルス対策ソフトのリアルタイムスキャンがゲームファイルを開くたびに割り込み、読み込みがさらに遅くなることもあります。

出典

  1. DirectStorage is coming to PC Microsoft
    以前のハードディスクは毎秒数十MB、NVMe SSDは毎秒数GB、前世代のゲームのアセットストリーミング予算は毎秒50MB前後。オープンワールドゲームは移動しながら遠くの景色をリアルタイムで読み込んでは破棄する
  2. Texture and mesh loading Unity
    同期アップロードはメインスレッドで1フレームのうちに読み込んで転送するため目に見える停止を生み、非同期アップロードは複数フレームにわたってストリーミングする
  3. Texture Streaming Overview for Unreal Engine Epic Games
    ストリーマーが視点に合わせてテクスチャの解像度(ミップ)を上げ下げする。計算の大部分は非同期のワーカースレッドで行い、画面に見えるミップから読み込む
  4. Profiler markers reference Unity
    AssetBundle.asset/allAssets警告:ロード完了前に結果を要求し、メインスレッドがブロックして待つ
  5. Stat Commands in Unreal Engine Epic Games
    stat Streaming(ストリーミングテクスチャのメモリ・数)、stat AsyncLoad(非同期ロードの統計)
  6. Windows Performance Monitor Disk Counters Explained Microsoft
    Avg. Disk sec/Readは読み込み1回の完了にかかった平均時間(I/O遅延)、Current Disk Queue Lengthは計測時点のディスクキューの長さ
  7. PresentMon Capture Application (README-CaptureApplication.md) Intel
    FrameTime(フレーム間のCPU時間)でフレームごとの時間を記録
  8. About regular quick and full scans with Microsoft Defender Antivirus Microsoft
    リアルタイム保護は、ファイルを開くときと閉じるときに毎回スキャンする

あわせて読みたい原因

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

同じ症状(表示されない・ゴースト)を起こすほかの層の原因

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