ゲームラグ白書 › L1 クライアントのゲームプロセス
大人数の描画負荷 Render/animation cost of crowds
原因ID cg-crowd · 主担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
攻城戦やワールドボスのように数百人が1つの画面に入ると、描画のコストそのものが処理しきれなくなります。
なぜ 1つの画面に数百人とエフェクトが重なる → すると アニメーション・影・名前表示・エフェクトのコストが人数に比例して増加 → 画面では FPSが60 → 15に落ち、すべての動きがカクつき、入力も遅れる
- 症状
- カクつき, 入力遅延
- 要因
- ストール
- 誰に起きるか
- 特定の場所・チャンネル, 自分だけ
- いつ
- 人が集中したとき
- 担当
- 主担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- 距離に応じた簡略化(LOD)、表示人数の上限、エフェクト簡略化オプション、アニメーション更新頻度の引き下げ。
- 数値の目安
- キャラクター1人あたり0.02〜0.1msでも、300人なら6〜30ms。60FPSのフレームバジェットは16.7msなので、これだけで予算の1/3以上を使い、多い場合は超えます。
- グラフでは
- 人数・負荷に連動して上昇 · フレームタイム、画面内のキャラクター数
- 確認箇所
- PresentMonのフレームタイムとCPUBusy・GPUBusyを、攻城戦・ワールドボスの前後で比較。開発ビルドではUnrealのstat Unit(ゲームスレッド・レンダリングスレッド・GPUの時間)
- 該当する場合
- 画面内の人数が増えるほどフレームタイムも上がり、表示人数の制限やエフェクト簡略化オプションを有効にするとすぐに改善する
- 該当しない場合
- 人数と関係なく跳ねるなら「フレームタイムのスパイク」か「クライアントのガベージコレクション」。FPSは問題ないのに他の人の動きだけ遅れるなら「メインスレッドのパケット処理ボトルネック」
- 確認手段
- ユーザー側の環境で確認
出典
- Introduction to level of detail Unity
LODがないと、画面上で小さく見える物体も同じ複雑さで描画する。LODで描画負荷を減らす - Animation Budget Allocator in Unreal Engine Epic Games
スケルタルメッシュのアニメーション更新(ティック)を動的に減らし、アニメーションにかける時間を予算内に抑える - PresentMon Capture Application (README-CaptureApplication.md) Intel
FrameTime・CPUBusy・GPUBusyで、CPUとGPUのどちらがフレームを遅らせているかを区別 - Stat Commands in Unreal Engine Epic Games
stat Unit:フレーム全体の時間と、ゲームスレッド・レンダリングスレッド・GPUの時間
あわせて読みたい原因
同じ層:L1 クライアントのゲームプロセス
同じ症状(カクつき)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る