1 はじめに
ゲームの動作が遅い、フリーズする、またはフリーズする場合は、ゲームにパフォーマンスの問題があることがわかります。問題を解決する前に、まず問題の原因を知る必要があります。問題が異なれば、必要な解決策も異なります。質問を推測したり、他の項目に基づいてゲームを調整したりすると、時間の無駄になり、問題がさらに悪化する可能性があります。
現時点では、問題を分析する必要があります。プロファイリングは、ゲームの実行中にさまざまな側面を測定することです。プロファイリング ツールを使用すると、ゲームの実行中に画面の背後で何が起こっているかを確認し、この情報を使用してパフォーマンスの問題の原因を追跡できます。プロファイリング ツールを調べることで、変更の結果を測定し、修正が有効かどうかを判断できます。
この記事では、次のことを行います。
- Unity に付属のプロファイラー ツールを使用して、パフォーマンスの低いゲーム データを収集します。
- このデータを分析し、分析結果を使用してパフォーマンスの問題を追跡します。
- これらの問題の修正へのリンクを提供します。
ゲームをスムーズに実行するには、バランスをとる必要があります。望ましい結果が得られるまでに、ゲームを何度か変更して検証する必要がある場合があります。プロファイリング ツールを使用して問題を分析する方法を知ることは、ゲームの何が問題なのかを判断し、次に何をすべきかを知ることができることを意味します。
2 フレンドリーなリマインダー
この記事は、Unity ゲームの動作が遅い、フリーズする、さらにはフリーズする場所を追跡するのに役立ちます。クラッシュや画像の異常など、他の問題が発生した場合、この投稿はあまり役に立たない可能性があります。この記事で説明されていないゲームの問題がある場合は、Unity マニュアル、Unity コミュニティ、または Unity Answers を検索してみてください。
プロファイラー ウィンドウやプロファイラーの使用方法に詳しくない場合は、最初にこの記事を読むことをお勧めします。
3 ゲームパフォーマンスの概要
フレームレートはゲームパフォーマンスの尺度です。ゲームのフレームはアニメーションのフレームに似ています。まさにゲーム画面が画面に描かれているだけです。画面にフレームを描画することをフレームのレンダリングと呼びます。フレーム レート、またはフレームがレンダリングされる速度は、1 秒あたり ( FPS ) で測定されます。
最近のほとんどのゲームは 60 FPS を目指しています。通常、特にパズル ゲームやアドベンチャー ゲームなど、高い反応速度を必要としない一部のゲームでは、30 以上の FPS が許容されると考えられます。VR など、比較的高いフレーム レート要件を持つ一部のゲームでは、90 FPS が拒否されます。フレーム レートが 30 FPS を下回ると、通常、プレーヤーのエクスペリエンスが低下し、画像がフリーズしたり、動作が重くなったりすることがあります。ただし、速度だけが重要ではなく、フレームレートの安定性も重要です。フレームレートの変化はプレイヤーにとって明らかです。不安定なフレームレートは、通常、フレームレートが低い安定したゲームよりも悪くなります。
ゲームのパフォーマンスについて話すときにフレーム レートについてよく言及されますが、ゲームのパフォーマンスを向上させようとする場合は、フレームのレンダリングにかかるミリ秒数を考慮する方がより有益です。理由は 2 つあり、第 1 に、これはより正確な測定方法です。ゲームのパフォーマンスを向上させようとすると、ミリ秒単位が目標に向けてカウントされます。第 2 に、フレーム レートの相対的な変化は、スケールが異なればフレーム レートも異なることを意味します。60 FPS から 50 FPS にすると処理時間は 3.3 ミリ秒増加しますが、30 FPS から 20 FPS にすると処理時間は 16.6 ミリ秒増加します。同じ 10 FPS 低いですが、フレームのレンダリングにかかる時間は大きく異なります。
一般的なフレーム レートでフレームをレンダリングするのに何ミリ秒かかるかを知ることは非常に役立ちます。これにかかる時間を調べるには、1000/[希望のフレーム レート]という式に従う必要があります。この式を使用すると、1 秒あたり 30 FPS の場合、レンダリングにかかる時間は 1 フレームあたり 33.3 ミリ秒未満であることがわかります。60 FPS で実行されるゲームの各フレームのレンダリングにかかる時間は 16.6 ミリ秒未満です。
レンダリングされるフレームごとに、Unity はさまざまなタスクを実行する必要があります。つまり、Unity はゲームの状態を更新し、ゲームのスナップショットを取得して、それを画面にレンダリングする必要があります。各フレームで実行する必要があるタスクには、ユーザー入力の読み取り、スクリプトの実行、照明の計算が含まれます。また、物理演算など、1 フレーム内で複数回実行される演算もあります。すべてのタスクが十分な速度で実行されると、ゲームのフレーム レートは安定して許容範囲内になります。すべてのタスクが十分な速度で実行されない場合、レンダリングに時間がかかり、フレーム レートが低下します。
どのタスクに最も時間がかかっているかを知ることは、ゲームのパフォーマンスの問題をトラブルシューティングする方法にとって重要です。どのタスクがフレーム レートを低下させているのかがわかれば、その部分の最適化を試みることができます。これが、プロファイリングが非常に重要である理由です。プロファイリング ツールは、特定のフレーム内で各タスクにかかる時間を表示できます。
4分析データを記録する
ゲームのパフォーマンスを研究するには、悪いゲーム パフォーマンスに関するデータを記録する必要があります。より正確な解析データを取得するには、ターゲット ハードウェア上で実行するテスト パッケージ ( 開発ビルド ) を作成し、解析データを記録する必要があります。
パッケージングや実機デバッグのプロセスに慣れていない場合は、ここをクリックして操作ガイドを参照してください。
実機を使用してデータを収集する
- 開発ビルド方法を使用して、パッケージ化し、ターゲット マシン上で実行します。
- パフォーマンスの問題が発生する前に、プロファイリング データの記録を開始します。
- パフォーマンスの問題が発生したら、プロファイラー ウィンドウの上の任意の場所をクリックしてゲームを一時停止し、フレームを選択します。
- プロファイラー ウィンドウの上部で、パフォーマンスが低いフレームを選択します。これは、要求されたフレーム レートまたは代表的なフレームを下回る「スパイク」である可能性があります。左右のキーまたは進むキーと戻るキーを使用すると、フレーム間をより適切に移動できます。
ゲームのパフォーマンス低下に関するプロファイリング データを取得しました。次に、このデータを分析する方法を学びましょう。
5 データの分析
ゲームのパフォーマンスについて結論を導く前に、プロファイラー ウィンドウに表示されるパフォーマンス データを読み取り、分析する方法を学ぶ必要があります。Unity がレンダリングに必要なすべてのタスクを時間内に完了できない場合、フレーム レートが低下することがわかっています。プロファイラー ウィンドウを使用して、どのタスクが実行されたか、どれくらい時間がかかり、どのような順序で実行されたかを正確に確認します。この情報は、タスクのどの部分がレンダリング時間が長すぎる原因となっているかを特定するのに役立ちます。
一連の手順を学ぶよりも、分析方法を学ぶ方が良いでしょう。これらのデータを自分で理解することは、新しい問題に遭遇したときに自分で調査できるようにするため、より有益です。Unity の回答を検索する方法を学んだばかりであっても、これは素晴らしいスタートです。
プロファイリングの方法を学ぶために、例として CPU プロファイラを使用します。これは、おそらくフレーム レートの問題を調査するために最もよく使用されるプロファイラです。
5.1 CPUプロファイラー
[プロファイラー] ウィンドウで CPU プロファイラーを見ると、CPU が各フレームを完了するのにかかる時間がわかります。
費やした時間を色分けした波形グラフで見ることができます。さまざまな色は、レンダリング操作や物理計算などに費やされた時間を表します。これらのキーワードは、どの色がどのタスクを表すかを示します。
次のスクリーンショットでは、このフレームの主な時間がレンダリング操作に費やされていることがわかります。以下の CPU 時間インジケーターは、このフレームで合計 CPU 時間が 85.95 ミリ秒で費やされたことを示しています。
階層図
CPU プロファイラーの階層ビューを使用して現在のデータを詳しく調べ、どのタスクが現在のフレームで最も多くの CPU 時間を費やしているかをより正確に確認してみましょう。CPU プロファイラーを選択すると、プロファイラー ウィンドウの下半分に現在のフレームの詳細情報が表示されます。プロファイラー ウィンドウの下半分を見ると、ドロップダウン メニューを使用して上の構造ビューを選択できます。これにより、CPU 上で発生しているタスクの詳細を確認できるようになります。
階層グラフでは、任意の列の列ヘッダーをクリックして、その値で並べ替えます。たとえば、[Time ms] をクリックして最長時間による並べ替えを開始し、[Calls] をクリックして現在強調表示されているフレーム内で最も多くの呼び出しが行われた関数で並べ替えを行います。上のスクリーンショットでは、時間のかかる順に並べ替えています。最も時間のかかる CPU 関数は Camera.Render であることがわかります。
関数名の左右に小さな矢印がある場合は、展開して、この関数によって呼び出される他の関数とそのパフォーマンスへの影響を確認できます。Self ms 列はこの関数自体の消費時間を示し、Time me 列はこの関数とこの関数が呼び出す他の関数の消費時間を示します。
この場合、Camera.Render の下で最も時間のかかる関数は Shadows.RenderJob であることがわかります。この特定の関数についてはまだよくわかっていませんが、ゲームの問題についてはすでに情報が得られています。私たちの問題はレンダリングに関連しており、最も時間のかかるタスクは shaodws に関連していることはわかっています。
階層グラフでできるもう 1 つの便利な機能は、ゲームのフレームを比較して、時間の経過とともにパフォーマンスがどのように変化するかを確認することです。CPU プロファイラーを使用して、最も時間のかかる単一関数をフレームごとに分析します。CPU プロファイラ階層図上の関数名をクリックすると、関数関連のデータが強調表示されます。
たとえば、階層ビューで Gfx.WaitForPresent をクリックすると、Gfx.WaitForPresent に関連するレンダリング関数が強調表示されます。
タイムラインビュー
次に、CPU プロファイラーのタイミング ビューを使用して、レンダリングの問題について詳しく見てみましょう。時間ビューには、CPU タスクが実行される順序と、どのスレッドがどのタスクを担当するかという 2 つのことが表示されます。プロファイラー ウィンドウの画面の下半分の左上隅にあるドロップダウン ボタンを使用して、タイムライン ビューを選択できます (以前は構造ビュー オプションが表示されていました)。
スレッドは複数の個別のタスクを同時に実行できます。1 つのスレッドがタスクを実行している間、別のスレッドは完全に独立したタスクを実行できます。Unity のレンダリング プロセスには、メイン スレッド 、 レンダリング スレッド 、 ワーカー スレッドの 3 種類のスレッドが含まれています 。どのスレッドがどのタスクを担当しているかを知ることは非常に役立ちます。最も遅いタスクを実行するスレッドがわかれば、それらのスレッドによって実行される操作の最適化に注力する必要があることがわかります。
タイムライン ビューを拡大して、個々のタスクを詳しく見ることができます。他の機能からの呼び出しも表示されます。この例では、Shadows.RenderJob を拡大して、このジョブを構成する個々のタスクを確認しました。Shadows.RenderJob がメインスレッドで呼び出されていることがわかります。また、ワーカー スレッドがシャドウに関連するタスクを実行していることもわかります。WaitingForJob タスクがメイン スレッドに表示され、メイン スレッドがワーカー スレッドによるタスクの完了を待っていることを示します。このことから、メインスレッドとワーカースレッドでシャドウ関連のレンダリング操作に時間がかかりすぎると結論付けることができます。問題はわかりました。
5.2 その他のアナライザー
CPU プロファイラーは、フレームレート関連のパフォーマンスの問題を追跡するときに最も一般的に使用されるツールですが、他のプロファイラーも同様に非常に役立ちます。他のアナライザーが提供する情報をよく理解しておくことをお勧めします。
上記の手順に従って、他のいくつかの異なるプロファイラーがフレームごとにどのような情報を提供するかを学習してください。たとえば、レンダー プロファイラーを使用して、フレームごとにレンダー統計がどのように変化するかを確認してみてください。
6 パフォーマンス問題の原因の特定
プロファイラーでパフォーマンス データを読み取って分析するプロセスに慣れてきたので、パフォーマンスの問題の原因を見つけ始めることができます。
6.1 垂直同期の影響を排除する
VSyncと呼ばれる垂直同期は 、ゲームのフレーム レートと画面のリフレッシュ レートを一致させるために使用されます。VSync はゲームのフレーム レートに影響を与え、その効果はプロファイラー ウィンドウに表示されます。何を調べているのかが分からないと、パフォーマンスの問題だと思われがちなので、パフォーマンスの問題に進む前に、vsync を除外する方法を学びましょう。
CPU プロファイラーで vsync 情報を非表示にする
CPU Profiler でどの情報を非表示にするかを選択できます。これにより、現在の研究に役に立たない情報を無視することができます。
VSync を非表示にする手順は次のとおりです。
- 「CPUプロファイラー」をクリックします
- プロファイラー ウィンドウの上部にある CPU プロファイラー領域に、現在関係するデータが表示されます。VSync とマークされた黄色の四角形をクリックして、垂直同期情報を非表示にします。
階層ビューで vsync 情報を無視する
階層ビューで vsync 情報を非表示にする方法はありませんが、それがどのようなものであるかはわかっているので無視できます。
階層ビューに WaitForTargetFPS が表示される場合は、ゲームが vsync を待機していることを意味します。この関数について学習する必要はなく、無視してください。
マスクvsync
すべてのプラットフォームで Vsync を無効にすることはできません。多くのプラットフォーム (iOS など) では Vsync が強制されます。ただし、vsync を強制しないプラットフォーム向けに開発している場合は、vsync を無効にすることができます。[編集] -> [プロジェクト設定] -> [品質]をクリックし 、 [VSync カウント]を見つけて、 メニューから [同期しない]を選択します。
6.2 レンダリングアナライザー
レンダリングはパフォーマンスの問題の一般的な原因です。解決策はケースバイケースであるため、レンダリングの問題を修正する前に、ゲームが CPU バウンドであるか GPU バウンドであるかを判断することが重要です。
簡単に言えば、何を描画するかを決定するのは CPU であり、描画するのは GPU です。レンダリングの問題の原因が CPU に時間がかかりすぎることである場合、ゲームは CPU に多大な負荷をかけており、レンダリングの問題の原因が GPU に時間がかかりすぎることにある場合、ゲームは GPU に多大な負荷をかけています。
ゲームが GPU を集中的に使用しているかどうかを確認する
ゲームが GPU を多用するかどうかを最も簡単に判断する方法は、GPU プロファイラーを使用することです。残念ながら、すべてのデバイスまたはドライバーがこのアナライザーをサポートしているわけではありません。GPU プロファイラーを使用する前に、まず GPU プロファイラーがターゲット デバイスで利用可能かどうかを確認します。
GPU プロファイラーがターゲット デバイスで利用可能かどうかを検出するには、次の手順を実行する必要があります。
- プロファイラー ウィンドウの左上隅で、[プロファイラーの追加] を選択します。
- ドロップダウン メニューから GPU を選択します
GPU プロファイラーがサポートされていない場合は、GPU が通常データを表示する領域に「GPU プロファイリングはサポートされていません」で始まるメッセージが表示されます。
このメッセージが表示されない場合は、GPU プロファイラーがターゲット デバイスでサポートされていることを意味します。GPU プロファイラーが利用可能な場合は、次の手順に従うことで、ゲームが GPU を大量に使用しているかどうかをすぐに判断できます。
- 「GPUプロファイラー」をクリックします
- 画面の中央に注目してください。現在選択されているフレームの CPU と GPU の経過時間が表示されます。
GPU 時間が CPU 時間より大きい場合、ゲームが GPU を大量に使用していることが確認できます。
ターゲット デバイスで GPU プロファイラーが利用できない場合でも、ゲームが GPU を大量に使用しているかどうかを判断できます。これは、CPU プロファイラーを調べることで実行できます。CPU が GPU がタスクを完了するのを待っていることがわかる場合、それはゲームが GPU を大量に使用していることを意味します。これに該当するかどうかを確認するには、次の手順を実行します。
- クリックして CPU プロファイラーを選択します。
- プロファイラーウィンドウの下部に表示されている現在のフレーム情報とプロファイラー情報を確認します。
- 領域の左上隅にあるドロップダウン メニューから [階層ビュー] を選択します。
- [Time ms] 列ヘッダーを選択すると、関数 time が時間で並べ替えられます。
関数 Gfx.WaitForPresent が CPU プロファイラーで最も時間のかかる関数である場合、これは CPU が GPU を待機していることを示します。これは、ゲームが GPU を大量に使用していることを意味します。
ゲームが GPU を集中的に使用する場合のレンダリングの問題を修正します。
ゲームが GPU を大量に使用していることが確認できた場合は、この記事を読む必要があります。
ゲームが CPU を集中的に使用するかどうかを特定する
パフォーマンスの問題の原因をまだ特定していない場合は、CPU ベースのレンダリングの問題を調べます。
- クリックして CPU プロファイラーを選択します。
- 時間の経過とともに、プロファイラー ウィンドウの上部にある情報にプロファイリング データが表示され、レンダリングを表すイメージの部分が検出されます。キーワードの横にある色付きの正方形の画像をクリックすると、このデータを表示または非表示にすることができます。
遅いフレーム時間のほとんどがレンダリングに費やされている場合、レンダリングが問題の原因である可能性があることを意味します。次のように掘り続けることで確認できます。
- クリックして CPU プロファイラーを選択します。
- プロファイラーウィンドウに表示されている現在のフレーム情報とプロファイラー情報を検出します。
- [分析データ] 領域の左上隅にあるドロップダウン メニューから [階層] を選択します。
- 関数の消費時間で並べ替えるには、列ヘッダーの Time ms を選択します。
- クリックして一番上の関数を選択します。
レンダリング機能が選択されている場合、CPU プロファイラー イメージはレンダリング イメージを強調表示します。これに該当する場合は、レンダリング関連の操作がパフォーマンスの問題を引き起こしていることを意味し、ゲームが CPU を集中的に使用していることが確認されます。関数名とその関数を実行するスレッドに注意してください。この情報は、問題を解決するときに役立ちます。
ゲームが CPU を集中的に使用する場合のレンダリングの問題を修正します。
ゲームに CPU 負荷の高いレンダリングの問題があることが確認された場合は、この記事をお読みください。
6.3 ガベージ コレクション アナライザー
次に、ガベージ コレクションがボトルネックになっているかどうかを確認します。ガベージ コレクションは Unity の自動メモリ管理の機能であり、動作が遅くなる場合があります。
- クリックして CPU プロファイラーを選択します。
- プロファイラー ウィンドウでは、この部分が黄色になってガベージ コレクションを表すことができ、名前の横にある小さな色のブロックでガベージ コレクションのデータ収集を表示またはキャンセルできます。関心のあるセクションの名前をドラッグ アンド ドロップして並べ替えることができることに注意してください。以下のスクリーンショットでは、 GarbageCollector を 一番上にドラッグし、クリックしてデータの他の側面をオフにしています。
遅いフレーム時間のほとんどがガベージ コレクションに費やされている場合、これは過剰なガベージ コレクションに問題があることを示しています。ドリルダウンして問題を確認できます。
- CPU プロファイラーをクリックして選択し、プロファイラー ウィンドウの下部に表示される現在のフレーム情報を確認します。
- 下部領域の左上隅にあるドロップダウン ボタンで、[階層ビュー] を選択します。
- [Time ms] 列ヘッダーを選択して、関数時間で並べ替えます。
GC.Collect() 関数が表示され、時間がかかる場合は、ゲームにガベージ コレクションの問題があることが確認できます。
ガベージ コレクションの問題の解決
ゲームにガベージ コレクションの問題があることが確認された場合は、この記事を読む必要があります。
6.4 物理アナライザー
レンダリングとガベージ コレクションの問題を除外した場合は、原因となる物理計算がパフォーマンスの問題の原因であるかどうかを確認します。
- クリックして CPU プロファイラーを選択します。
- データを表示しているプロファイラー ウィンドウの上部で、物理学を表す画像 (オレンジ色の画像) を検出します。名前の横にある色付きの四角形をクリックすると、画像を表示または非表示にします。
遅いフレーム時間の大部分が物理によって占められている場合、物理計算が問題の原因であることが確認されます。さらに調査して問題を確認できます。
- CPU プロファイラーをクリックして選択し、プロファイラーの下の領域に表示される現在のフレームの詳細を確認します。
- 下部領域の左上隅にあるドロップダウン メニューから [階層ビュー] を選択します。
- [Time ms] 列ヘッダーを選択して、関数時間で並べ替えます。
- 上部の機能をクリックして選択します。
物理関数が選択されている場合、CPU プロファイラー イメージは物理イメージを強調表示します。この場合、パフォーマンスの問題の原因は物理計算に関連していると判断できます。
物理学の問題を解く
問題が物理的な原因であることが確認された場合は、次の情報が役に立ちます。
6.5 遅いスクリプト
スクリプトが遅いか、複雑すぎるかがパフォーマンスの問題の原因であるかどうかを検出できるようになりました。スクリプト。ここでは Unity 以外のエンジン コードになります。これらのスクリプトは通常、自分で作成するか、サードパーティのプラグインによって導入されます。
- クリックして CPU プロファイラーを選択します
- データを表示するプロファイラー ウィンドウの上部で、スクリプトを表す画像を検出します。キーワードの横にある色の四角をクリックすると、画像データを表示または非表示にできます。
遅いフレームの大部分がスクリプトによって占められている場合は、開発者が作成したスクリプトが問題の原因であることが確認できます。確認問題に進みます。
- [プロファイラー] ウィンドウの下部で、現在のフレームの詳細データを検出する CPU プロファイラーをクリックして選択します。
- 下部領域の左上隅にあるドロップダウン メニューから [階層ビュー] を選択します。
- [Time ms] 列ヘッダーを選択して、関数時間で並べ替えます。
- 上部の機能をクリックして選択します。
独自のスクリプトを作成した場合は、CPU プロファイラーのイメージでスクリプトのイメージが強調表示されます。この場合、パフォーマンスの問題の原因が、作成したスクリプトに関連していることが確認できます。
上記には特殊なケースがあることに注意してください。ゲームにイメージ エフェクト スクリプト、OnWillRenderObject または OnPreCull 関数などのレンダリング関連関数が含まれている場合、これらはスクリプト プロファイラーではなくレンダリング プロファイラーに表示されます。
最初は少し戸惑いましたが、普段階層構造ビューやタイムラインビューを使ってコードを検出していると、該当するコードを追跡することもできます。
遅いコードのトラブルシューティング
作成したスクリプトがパフォーマンスの問題の原因であると判断した場合は、パフォーマンスを向上させるための簡単なヒントをいくつか紹介します。コードの最適化に関するリソースは次のとおりです。
7 パフォーマンス問題のその他の原因
パフォーマンスの問題の最も一般的な 4 つの原因について説明しましたが、ゲームにはここで言及されていないパフォーマンスの問題がいくつか存在する可能性があります。この場合、上記の方法のいくつかを使用してデータを収集し、CPU プロファイラーを調べて、問題の原因となっている関数名を見つける必要があります。関数名がわかれば、Unity マニュアル、Unity コミュニティ、Unity Answers を検索することで、この関数に関する情報と、これらの関数の使用量を削減する方法を見つけることができます。
学習の推奨事項: Unity パフォーマンス分析のためのプロファイラー ツールの使用_mob60475702a1ff の技術ブログ_51CTO ブログ