プロファイリング
イントロ
一般的にプロファイリングは、コードの部分間の相対的なパフォーマンスを見つけ出し、開発者がホットスポットを掘り下げることを可能にする良いツールです。しかし、プロファイリングツール、特にUnityのものは、そのオーバーヘッドがパフォーマンスに影響を与えるため、絶対的なパフォーマンス測定値を見つけるには役に立ちません。
推奨される性能解析の手順:
- Quantum Release ビルド (quantum solution) 、 IL2CPP Unity ビルド、 添付のQuantum Graph Profiler を使用してシミュレーション時間、レンダリング時間などを測定し、経時的な総合値を出します。
- チェックサムを頻繁に行うとパフォーマンスに影響するため、
DeterministicConfig.ChecksumInterval
にはゼロか大きな値を設定するようにしてください。 - 次に、シミュレーションやレンダリングなど、どこを見るべきかを大まかに把握した上で、Unity ProfilerやQuantum Task Profilerを使ってプロファイリングを行ってください。
Quantumのデバッグビルドは、リリースビルドの5倍遅くなることがあります。また、デバッグ+モノのビルドは、リリース+IL2CUPのビルドの10倍遅くなる可能性があります。
Unity Profiler
Quantum のパフォーマンス統計は Unity Profiler に統合されており、QuantumRunner スクリプト内でデフォルトで開始されます。
C#
Quantum.Profiling.HostProfiler.Init(..)
Unity Profilerのパターンを利用することで、Quantumシミュレーションのコードにカスタムセクションを追加することができます。
C#
HostProfiler.Start("Foo");
{
HostProfiler.Start("Bar1");
// do work
HostProfiler.End();
HostProfiler.Start("Bar2");
// do work
HostProfiler.End();
}
HostProfiler.End();
Quantum SDKの最新バージョン(2.1)では、UnityのTimelineプロファイラ用のデータも提供しています。Quantum は Debug
設定でのみプロファイリングデータを提供します。
Quantum Task Profiler
Quantum Task Profiler は、Unity Timeline プロファイラーのような、Unity 用のカスタムかつスタンドアローンのグラフィカルなパフォーマンスプロファイラーです。Quantumソリューションが Debug
または ReleaseProfiler
設定でコンパイルされたときのみデータを提供します(後者は、Quantum 2.1で追加されています)。Unity Profilerと同様に、リモートデバイス上で動作するアプリは、同じローカルネットワーク内のUDP経由でUnityエディタに接続します。
リモートプロファイリング
エディターと同じネットワーク上で動作するビルドのために、Quantum Task Profilerにリモートでフックすることが可能です(UDPポート 30000)。この機能を有効にするには、QuantumEditorSettings
アセットの下部にあるRemote Profiler
チェックボックスをオンにします。その後、Task Profiler Viewを閉じ、再度開いてください。
Quantum Graph Profiler
Quantum Graphプロバイダは、パフォーマンスとネットワーク統計を視覚的に分析するために、アプリに統合することができる追加ツールです。
ご使用のUnity Editorに対応したバージョンをダウンロードしてください。
Unity バージョン | リリース日/th> | ダウンロード |
---|---|---|
Unity 2018.4 | 2020年1月30日 | QuantumProfilers_Unity2018_20230414 |
Unity 2019.4+ | 2021年6月28日 | QuantumProfilers_20230414 |
リアルタイムプロファイリング
これらのランタイムグラフは、様々なネットワーク条件下でのゲームとQuantumシミュレーションの全体的なパフォーマンスを追跡するのに役立ちます。グラフとその値はUnityの更新レートに基づいており、各値はUnityの1フレームで蓄積された時間/カウント/その他...に等しくなっています。
プロファイラには、以下のグラフがあります。
Engine Delta Time
: Unityフレーム間のTime.unscaledDeltaTime
。Engine Delta Time
がターゲットFPSを反映しないことがあります。これを修正するにはQualitySettings.vSyncCount = 0
を設定してください。Frame Time
: Unity内部とレンダリングを含む全てのスクリプトロジック。フレーム終了の待ち時間は除く。User Scripts Time
:FixedUpdate()
+Update()
+LateUpdate()
を実行する時間。Render Time
: 最後のLateUpdate()
からレンダリングが終了するまでの時間。Simulation Time
:QuantumRunner.Default.Game.Session.Stats.UpdateTime
と等しい。Predicted Frames
: Unityフレームでシミュレートされる予測されるQuantumフレームの量はQuantumRunner.Default.Game.Session.PredictedFrames
と同じです。Verified Frames
: Unityフレームでシミュレートされた検証済みQuantumフレームの量。Network Activity
: サーバーからの最後のデータ送信からの経過時間です。Ping
:ネットワークピアのラウンドトリップタイム(RTT)。Markers
: マーカーを使用して、最大8つのカスタムブーリアン値を追跡することができます。各マーカーは固有の色で表現され、デフォルトでは赤 = 入力がサーバに置き換えられる
とオレンジ = チェックサムが計算される
となっています。
マーカーについて
見やすくするために、マーカーのグラフは他のグラフより2倍速く動作しています。これは、Profilers プレハブの Samples
プロパティで調整することができます。
MarkersProfiler
の複数インスタンスがサポートされています。
- インスタンスを
MarkersProfiler
profiler =MarkersProfiler.Get(GAMEOBJECT_NAME)
という名前で取得します Profiler.SetMarker(INDEX)
を呼び出す。
他のツール
リアルタイムプロファイリングツールには、他にも以下のような(より基本的な)ツールがあります。
- ターゲットFPSの変更 (
Application.targetFrameRate
) - ネットワークの状態(遅延、ジッター、損失)をシミュレート
これらは、異なるレンダリング速度や悪いネットワークを素早くシミュレートするのに便利です。その効果は、グラフですぐに確認できます(予測フレーム数、シミュレーション時間、...)。
N.B.: ネットワーク損失をシミュレートする場合は、値の設定に注意してください。ネットワーク上の損失をシミュレートする場合は1~3%、ローカルな損失をシミュレートする場合はより高い値を使用します(例:3つの壁の向こうのルーターに接続不良)。
リモートプロファイリング
エディタと同じネットワーク上で動作しているビルドに対して、リモートでQuantum Task Profilerにフックすることが可能です。この機能を有効にするには、QuantumEditorSettings
アセットの一番下にあるRemote Profiler
チェックボックスをオンにします。