プロファイラーウィンドウを使ってパフォーマンスの問題を診断する

確認済のバージョン: 5.4

-

難易度: 中級

はじめに

ゲームの動きが遅くなったり、カクツキやフリーズが起こっている時は、パフォーマンスの問題が発生しています。修正策を講じるに当たっては、まず何が問題の原因となっているか把握する必要があります。解決策は問題の種類によって異なります。当てずっぽうに原因を推測したり、他のプロジェクトで成功した解決策を基に修正を試みたりすると、時間を無駄にしたり、問題を悪化させたりすることにもなり兼ねません。

ここでプロファイリングが役に立ちます。プロファイリングは、ランタイムでゲームのパフォーマンスを様々な面から計測する処理です。プロファイリングツール を使用することで、ゲームの実行中に内側で何が起こっているかを把握し、その情報をパフォーマンス問題の原因を究明するために役立てることができます。プロファイリングツールを確認しながら変更を加えることで、その結果を具体的に把握でき、それが効果的な方法かどうかを知ることができます。

この章では、以下の方法を学んで行きます。

  • Unity ビルトインのプロファイラーウィンドウを使用して、パフォーマンスの低下しているゲームのデータを収集する。

  • そのデータを分析し、分析結果を基にパフォーマンス問題の原因を特定する。

  • その特定の問題に関する記事のリンクを見付ける。

ゲームが潤滑に実行されるようにするには、繊細なバランス調整が必要とされます。目標の結果を得られるまで、変更を加えて効果を計測する作業を何度か繰り返す必要があるかもしれません。プロファイリングツールを使って問題を分析する方法を学べば、問題の原因およびその修正策の特定が可能になります。

本記事の内容に関する注記

この記事は、Unity ゲームの動きが遅くなったり、カクツキやフリーズが起こっている場合の問題の究明に役立つ内容となっています。それ以外の問題(例えばクラッシュや、グラフィックの表示の異常など)が起こっている場合に関しては、ここでは取り扱っていません。この記事で網羅されていない問題が発生した場合は、Unity マニュアルや Unity フォーラム、Unity Answers を検索してみてください。

プロファイラーウィンドウ自体についての説明や、それを使用して特定のデバイスのゲームからプロファイリングデータを収集する方法を学びたい場合は、事前にこちらの記事 をお読みください。

ゲームのパフォーマンスに関する簡単な説明

フレームレート とは、ゲームのパフォーマンスを測る標準的な単位です。ゲームにおけるフレームも、アニメーションにおけるフレームと同様で、画面に描画される静止画像の一枚一枚がフレームと呼ばれます。画面にフレームを描画することをフレームのレンダリングと言います。フレームレートとは、フレームがレンダリング(レンダー)される速度のことで、これは_ 1 秒当たりのフレーム数_ (FPS) の単位で表されます。

最近のゲームは、フレームレート 60 FPS を目標としているものがほとんどです。一般的には 30 FPS 以上のフレームレートが許容範囲内とされています。特にパズルゲームやアドベンチャーゲームなど、とりわけて素早い反応を必要としないゲームの場合はこれが当てはまります。プロジェクトによっては特別な条件を満たさなければならないものもあります。例えば VR の場合、90 FPS が必須と考えられています。フレームレートが 30 FPS 未満だとグラフィックがガクガクしたり操作に対する反応が悪くなる傾向にあり、プレイヤーがゲーム体験を不快に感じやすくなります。ただし、重要なのは速度だけではありません。フレームレートは一定である必要があります。プレイヤーはフレームレートの変化を敏感に感知するので、フレームレートが一定(安定)していないゲームは、フレームレートが低くて安定しているゲームよりも劣ったものとして捉えられる傾向にあります。

ゲームのパフォーマンスの良し悪しはフレームレートをもって語られることが多いですが、ゲームのパフォーマンスを向上させるに当たっては、1 フレームのレンダリングに掛かる時間をミリ秒単位で考えることの方が有益です。その理由は二つあります。一つには、後者の方がより精密に計測できることです。ゲームのパフォーマンスを向上させるためには、1 ミリ秒の違いが物を言います。二つ目の理由は、フレームレートの相対的な変化の意味がスケールによって大きく変わってくることです。例えば 60 FPS が 50 FPS に変化した場合、処理時間が 3.3 ミリ秒増加したことを意味しますが、30 FPS から 20 FPS に変化した場合は 16.6 ミリ秒の増加を意味します。両方とも FPS が 10 低下したことに変わりはありませんが、フレームのレンダリングに掛かる時間の差は大幅に異なります。

共通フレームレートに到達するためには 1 フレーム毎に何ミリ秒レンダーされる必要があるのかを理解することが大切になります。この数値を求めるには、1000/[目標のフレームレート] という公式を使用します。この数式を使用すると、例えば 30 FPS でレンダリングするためには各フレームを 33.3 ミリ秒以内でレンダリングする必要があることが分かります。60 FPS でゲームを実行したい場合は、各フレームを16.6 ミリ秒以内でレンダリングする必要があります。

1 フレームをレンダーする毎に Unity は様々な異なるタスクを実行します。その内容は大まかに言うと、ゲームの状態を更新し、ゲームのスナップショットを取り、そのスナップショットを画面に描画する処理です。フレーム毎に実行が必要なタスクには、ユーザー入力の読み取りや、スクリプトの実行、ライティング(光)の演算処理などが含まれます。これに加えて物理演算などの処理は 1 フレーム内に何度も実行されることもあります。こういったタスクの全てが十分な速度で実行されれば、ゲームのフレームレートが安定します。逆に、これらのタスクが全て十分な速度で実行されなければ、フレームのレンダリングに過剰に時間が掛かり、フレームレートが低下することになります。

パフォーマンスの問題を解決するためには、どのタスクにどれだけの時間が掛かっているかを把握することが不可欠です。フレームレートを低下させているタスクを特定できれば、ゲーム内のその部分を最適化するための対策を講じることができます。プロファイリングは、これを行うために必要不可欠なものです。プロファイリングツールを使用することで、任意のフレームにおいて各タスクにどれだけの時間が掛かっているかを把握することができます。

プロファイリングデータの記録

パフォーマンスの問題を調査するには、まず、ゲーム内でパフォーマンスが低下している部分のプロファイリングデータを記録する必要があります。正確なプロファイリングデータを取得するには、ゲームの開発ビルドを作成し、ターゲットのハードウェア上でゲームを実行中にプロファイリングデータを記録します。

開発ビルドの作成や、そのプロファイリングデータの記録に関する詳細はこちらの記事をご参照ください。

ゲームの開発ビルドからプロファイリングデータを記録する

開発ビルドの作成や、そのプロファイリングデータの記録に関する詳細はこちらの記事をご参照ください。

  • ゲームの開発ビルドをターゲットデバイス上に作成します。

  • ゲーム内でパフォーマンス問題の発生している箇所に達する直前に、プロファイリングデータの記録を開始します。

  • パフォーマンス問題の発生例を含むプロファイリングデータの記録が完了したら、プロファイラーウィンドウの上部のどこかをクリックしてゲームを一時停止し、フレームを 1 つ選択します。

  • プロファイラーウィンドウの上部で、パフォーマンスの問題が発生しているフレームを 1 つ選択してください。スパイクの起こっているフレームかもしれませんし、フレームレートが単純に目標値に達していない部分の中の平均的なフレームの 1 つかもしれません。フレーム間の移動を細かく行うには、左右の方向キーか、プロファイラーウィンドウ上の Back(戻る)・Forward(進む)ボタンを使用します。

参考画像

これで、パフォーマンスが低下している部分のプロファイリングデータの収集が完了しました。次に、このデータを分析する方法を学んでいきましょう。

プロファイリングデータを分析する

パフォーマンス問題の原因が何であるか、結論を導き出すためには、プロファイラーウィンドウに表示されるパフォーマンスデータを読み取って分析する方法を学ぶ必要があります。前述の通り、フレームレートの低下は、各フレームのレンダリングに必要な全てのタスクを一定時間内に完了できない場合に起こります。プロファイラーウィンドウを使用して、どのタスクが実行されているか、また各タスクにどれだけの時間が掛かっているか、更にそれらのタスクがどのような順序で実行されているかを確認します。これらの情報が、ゲーム内のどこが原因でフレームのレンダリングに過剰な時間が掛かっているか理解する助けになります。

特定の決まった手順を覚えるよりも、プロファイリングの方法を理解して学ぶほうが効率的です。自分自身でデータを解釈できれば、新しい問題に直面した時に独自に調査を行うことができます。例えば Unity Answers で何を検索すべきかが明確になるだけでも、問題解決への大きな一歩と言えるでしょう。

ここでは CPU Usage プロファイラーを例に取ってプロファイリングの方法を学んでいきましょう。フレームレートの問題を調査する場合に最も頻繁に使用されるのはこのプロファイラーです。

CPU Usage (CPU 使用状況)プロファイラー

CPU Usage プロファイラーはプロファイラーウィンドウの上部にあります。このプロファイラーでは、各フレーム内において、タスクの完了に掛かっている CPU 時間を確認することができます。

参考画像

時間がそれぞれ何に使用されているかを、色分けされた表示で確認することができます。レンダリング処理、物理演算などの項目別に、使用されている時間が異なる色で表示されます。項目名のリストを参照すれば、どの色がどのタスクを表しているか確認できます。

下のスクリーンショットを見ると、このフレームでは大部分の時間がレンダリング処理に使用されていることが分かります。画像の下部にある CPU 時間表示は、このフレームの CPU 時間の合計が 85.95 ミリ秒であることを示しています。

参考画像

Hierarchy (ヒエラルキー)ビュー

この情報を、CPU Usage プロファイラーのHierarchy ビューを使って掘り下げ、このフレーム内で最も CPU 時間を消費しているタスクを特定してみましょう。CPU Usage プロファイラーが選択された状態で、プロファイラーウィンドウの下半分に表示されるのは該当フレームの詳細情報です。ウィンドウの左上にあるドロップダウンメニューから Hierarchy ビューを選択し、下半分の表示を確認してください。実行されている CPU のタスクの詳細情報が表示されます。

参考画像

Hierarchy ビュー内の任意の列のヘッダーをクリックすると、その項目の値の順に情報が並び替え(ソート)されます。例えば、Time ms(ミリ秒単位の時間) をクリックすると掛かる時間の長い順に関数がソートされ、Calls をクリックすると現在選択中のフレーム内で関数の呼び出される回数順にソートされます。上のスクリーンショットでは、Time ms の値によって関数がソートされており、CPU 時間を最も多く消費している関数は Camera.Render であることが分かります。

関数の左横に矢印が表示されている場合は、表示を展開することで、その関数によって呼び出される他の関数および、それらがパフォーマンスにどのように影響するかを確認することができます。Self ms の列は、該当の関数自体が消費する時間を表し、Time ms は、該当の関数、およびその関数によって呼び出される全ての関数が消費する時間の合計を表します。

参考画像

この画像では、Camera.Render 内で最も時間を消費している関数が、Shadows.RenderJob という関数に関連したものであることが分かります。この時点で、この関数についてまだ詳しく理解できていない場合でも、発生している問題についての大きな手掛かりが得られたことになります。問題がレンダリングに関連していること、そしてこの特定の時点で最も時間の掛かっているタスクはシャドウに関係したものであることが読み取れます。

Hierarchy ビューでは上記の他にも有益な情報を読み取ることができます。具体的には、異なるフレームを比較することで、時間の経過と共にパフォーマンスがどのように変化しているかが分かります。CPU Usage プロファイラーを使用すると、特定の関数の消費時間をフレームごとに確認していくことができるようになっています。CPU Usage プロファイラーでは、Hierarchy ビュー内の特定の関数名をクリックすると、プロファイラーウィンドウ上部のグラフにその関数の占める部分がハイライト表示されます。

参考画像

例えば、Hierarchy ビュー内で Gfx.WaitForPresent をクリックすると、 Gfx.WaitForPresent に直接関連した Rendering データがグラフ内でハイライト表示されます。

Timeline ビュー

それでは、CPU Usage プロファイラーの Timeline ビュー を使用して、レンダリングに関連したこの問題の詳細を見ていきましょう。Timeline ビューでは二つのことが分かります。CPU のタスクの実行される順番と、各スレッドがどのタスクを扱っているかを確認することができます。Timeline ビューの選択は、プロファイラーウィンドウの下半分の、左上(上記で Hierarchy と表示されていた部分)にあるドロップダウンメニューから行います。

参考画像

スレッドは、異なるタスクの同時実行を可能にするものです。あるスレッドが特定のタスクを実行するのと並行して別のスレッドが全く異なるタスクを実行できるようになっています。Unity のレンダリング処理には、メインスレッドレンダースレッドワーカースレッド の三種類のスレッドが関わっています。どのスレッドがどのタスクを扱っているかを理解すると非常に役立ちます。最も時間の掛かっているタスクがどのスレッドで実行されているか分かれば、そのスレッドで実行される処理の最適化を重点的に行うべきであることが明確になるからです。

参考画像

Timeline ビュー上の個々のタスクをより詳しく見てみましょう。ある関数が別の関数を呼び出している場合、呼び出されている関数は、呼び出している関数のすぐ下に表示されます。ここでは Shadows.RenderJob に焦点を当て、このタスクを構成しているタスクを確認してみましょう。この画像を見ると、Shadows.RenderJob が、メインスレッドで実行される関数を呼び出していることが分かります。また、ワーカースレッドがシャドウに関連したタスクを実行していることも確認できます。そしてメインスレッド上に WaitingForJob が存在していることから、特定のワーカースレッドが特定のタスクを完了するのをメインスレッドが待機していることも分かります。以上の事から、シャドウに関連したレンダリング処理がメインスレッドおよびワーカースレッド上で過剰に時間を消費しているという結論が導き出せます。ここまでで、問題をかなり詳細に把握することができました。

その他のプロファイラー

フレームレートに関連したパフォーマンスの問題を調査する際に最も良く使用されるプロファイラーは CPU Usage プロファイラーですが、他のプロファイラーによって提供される情報の解釈方法も学ぶことで、それらを非常に有利に活用することができます。

上記の手順を、他のプロファイラーでも試してみてください。各種のビューを開き、フレームごとにどんな情報が表示されるか確認してみましょう。例えば Rendering プロファイラーを使用して、フレームごとにレンダリングの状態がどのように変化するか確認してみてください。

パフォーマンス問題の原因を特定する

ここまでで、プロファイラーウィンドウでパフォーマンスのデータを読み取り、分析する方法を学ぶことができました。次に、問題の原因を特定するステップに進みましょう。

VSync を無視する

Vertical Synchronization(VSync)は、ゲームのフレームレートを、表示される画面のリフレッシュレートに一致させるために使用されます。VSync はゲームのフレームレートに影響を及ぼす場合があり、この影響がプロファイラーウィンドウに表示されるデータにも反映されることがあります。表示の内容が理解できていないと、これがパフォーマンス問題であるかのように見えることがあります。このため、次のステップに進む前に、問題調査の際に VSync を見分けて無視する方法を学ぶ必要があります。

CPU Usage プロファイラーで VSync の情報を非表示にする

CPU Usage プロファイラーのグラフ内の情報は非表示にすることも可能です。非表示にすることで、調査に役立たない情報を無視することができます。

CPU Usage プロファイラーのグラフ内で VSync の情報を非表示にするには、次の手順を行ってください。

  • CPU Usage プロファイラーをクリックして選択します。

  • プロファイラーウィンドウ上部の、CPU Usage プロファイラーの経時変化データの表示内で、VSync と書かれた黄色い四角形をクリックしてください。これにより VSync の情報がグラフ上に表示されなくなります。

Hierarchy ビュー上で VSync の情報を無視する

CPU Usage プロファイラーの Hierarchy ビューから VSync の情報を非表示にすることはできませんが、表示の見分け方を学べば、無視することができます。

Hierarchy ビューに WaitForTargetFPS という関数がある場合、ゲームが VSync を待機していることを意味します。この関数を調査する必要はありませんので、無視しても問題ありません。

VSync を無効にする

VSync は全てのプラットフォームで無効化できる訳ではありません。この使用が強制されるプラットフォームも多くあります(iOS など)。 しかし、VSync の使用が強制されないプラットフォーム向けの開発であれば、プロファイリング中には全ての VSync を無効にしても問題ありません。VSync を無効にするには、上部のメニューバーから Quality Settings インスペクターを開き、Edit **> **Project Settings > Quality の順に選択し、VSync Count と表示されたドロップダウンメニューから Don’t Sync を選択してください。

参考画像

レンダリングのプロファイリング

パフォーマンス問題のよくある原因のひとつはレンダリングです。ゲームが CPU バウンド になっているか GPU バウンド になっているかで必要な解決策が異なるため、レンダリングの問題修正を試みる前に、どちらの状況であるか特定することが重要です。

レンダリングが行われる際は、中央処理装置(CPU)が描画する内容を決定し、グラフィックス・プロセッシング・ユニット(GPU)が描画を行う仕組みになっています。CPU がフレームをレンダーするのに時間が掛かり過ぎていることが原因でパフォーマンス問題が起こっている場合、これは CPU バウンドと呼ばれる状態です。これに対し、GPU がフレームのレンダーするのに時間が掛かり過ぎていることが原因で問題が起こっている場合は、ゲームは GPU バウンドの状態ということになります。

ゲームが GPU バウンドになっているかどうか特定する

ゲームが GPU バウンドの状態かどうかを最も簡単に確認するには、GPU Usage プロファイラーを使用します。残念ながらこのプロファイラーに対応していないデバイスもあります。ゲームが GPU バウンドの状態かどうか確認する前に、ターゲットのデバイスが GPU Usage プロファイラーに対応しているかどうか確認する必要があります。

ターゲットのデバイスが GPU usage プロファイラーに対応しているかどうか確認するには、以下の手順を行ってください。

  • プロファイラーウィンドウの左上で Add profiler を選択してください。

  • ドロップダウンメニューから GPU を選択します。

ターゲットデバイスが GPU Usage プロファイラーに非対応である場合は、通常 GPU Usage プロファイラーのデータが表示される部分に "GPU Profiling is not supported" という表現で始まるメッセージが表示されます。

参考画像

このメッセージが表示されない場合は、ターゲットのデバイスは GPU Usage プロファイラーに対応しています。その場合は以下の手順で GPU Usage プロファイラーを使用すれば、ゲームが GPU バウンドになっているかどうかを簡単に確認することができます。

  • GPU usage プロファイラーをクリックして選択します。

  • 画面中央に、現在選択中のフレームにおける CPU 時間と GPU 時間が表示されます。

GPU 時間が CPU 時間よりも長ければ、ゲームはこの時点においては GPU バウンドの状態です。

参考画像

ターゲットのデバイスが GPU Usage プロファイラーに対応していない場合でも、CPU の使用状況を観測すれば、ゲームが GPU バウンドになっているかどうか確認できます。GPU のタスクが完了するのを CPU が待機している状態が観測されれば、GPU バウンドということになります。次の手順で確認を行ってください。

  • CPU Usage プロファイラーをクリックして選択します。

  • プロファイラーウィンドウ下部の、現在選択中のフレームおよびプロファイラーの詳細情報が表示される領域を確認してください。

  • この領域の左上にあるドロップダウンメニューから Hierarchy を選択してください。

  • Time ms の列を選択すると、関数がミリ秒単位の時間によってソート(並び替え)されます。

CPU Usage プロファイラー内で最も時間が掛かっている関数が Gfx.WaitForPresent であれば、CPU が GPU を待機していることを意味します。この場合、ゲームはこの時点では GPU バウンドの状態ということになります。

参考画像

ゲームが GPU バウンドになっている場合のレンダリング問題の解決

ゲームが GPU バウンドの状態であることが確認された場合は、この記事 をご参照ください。

ゲームが CPU バウンドになっているかどうか特定する

この時点でまだパフォーマンス問題の原因が特定できていなければ、CPU に起因するレンダリング問題の調査を開始しましょう。

  • CPU Usage プロファイラーをクリックして選択します。

  • プロファイラーウィンドウ上部の、CPU Usage プロファイラーの経時変化データの表示内で、レンダリングを示す色の付いた部分を確認してください。左側の各データ項目名の横にある色付きボックスをクリックすると、そのデータの表示・非表示を切り替えられます。

時間の掛かっているフレームにおいて、そのフレーム時間の大部分がレンダリングによって消費されている場合は、レンダリングが問題の原因になっている可能性があります。これを確認するため、以下の手順でプロファイリングデータを更に詳しく掘り下げてみましょう。

  • CPU Usage プロファイラーをクリックして選択します。

  • プロファイラーウィンドウ下部の、現在選択中のフレームおよびプロファイラーの詳細情報が表示される領域を確認してください。

  • この領域の左上にあるドロップダウンメニューから Hierarchy を選択してください。

  • Time ms の列を選択すると、関数がミリ秒単位の時間によってソート(並び替え)されます。

  • リストの一番上の関数をクリックして選択します。

選択した関数がレンダリング関数であれば、CPU プロファイラーのグラフ上でその関数が Rendering 表示の一部としてハイライト表示されます。この場合、レンダリング関係の処理がゲームのパフォーマンスを劣化させており、ゲームがこの時点では CPU バウンドの状態になっていることを意味します。関数の名前と、その関数が実行されているスレッドを確認してください。修正を行う際にこの情報が役立ちます。

ゲームが CPU バウンドになっている場合のレンダリング問題の修正

レンダリングの問題が原因でゲームが CPU バウンドになっていることが特定された場合は、 こちらの記事をご参照ください。

ガベージコレクションのプロファイリング

次に、 ガベージコレクションが障害になっていないかどうか確認してみましょう。ガベージコレクションは Unity の自動メモリ管理に関連した機能ですが、これにより処理が遅くなることがあります。

  • CPU Usage プロファイラーをクリックして選択します。

  • プロファイラーウィンドウ上部の、CPU の経時変化データのグラフ内で、Garbage Collector を表す部分を確認してください。リストの各項目の左側にある色の付いた四角形(カラーボックス)をクリックすると、その項目のデータの表示・非表示を切り替えられます。項目をドラッグして並び替えることも可能です。下の画像は GarbageCollector をリストの一番上にドラッグし、その他全ての項目のカラーボックスをクリックして非表示にした状態です。

参考画像

時間の掛かっているフレームにおいて、そのフレーム時間の大部分がガベージコレクションによって消費されている場合は、過剰なガベージコレクションが問題となっている可能性があります。これを確認するため、以下の手順でプロファイリングデータを更に詳しく掘り下げてみましょう。

  • CPU usage プロファイラーが選択された状態で、プロファイラーウィンドウ下部にある、現在選択中のフレームの詳細情報が表示される領域を確認してください。

  • この領域の左上にあるドロップダウンメニューから Hierarchy を選択してください。

  • Time ms の列を選択すると、関数がミリ秒単位の時間によってソート(並び替え)されます。

関数 GC.Collect() が CPU 時間を過剰に消費しているようであれば、ガベージコレクションが問題になっていることを意味します。

ガベージコレクションの問題を解決する

ゲームにガベージコレクションの問題が起こっていることが特定された場合は、こちらの記事をご参照ください。

物理のプロファイリング

問題の原因がレンダリングでもガベージコレクションでもなかった場合は、パフォーマンス問題が複雑な物理演算に起因していないかどうか確認してみましょう。

  • CPU Usage プロファイラーをクリックして選択してください。

  • プロファイラウィンドウ上部の、CPU の経時変化データのグラフ内で、Physics を表す部分(オレンジ色のグラフ)を確認してください。リストの各項目の左側にある色の付いた四角形(カラーボックス)をクリックすると、その項目のデータの表示・非表示を切り替えられます。

時間の掛かっているフレームにおいて、そのフレーム時間の大部分が物理によって消費されている場合は、物理が問題の原因になっている可能性があります。これを確認するため、以下の手順でプロファイリングデータを更に詳しく掘り下げてみましょう。

  • CPU usage プロファイラーが選択された状態で、プロファイラーウィンドウ下部にある、現在選択中のフレームの詳細情報が表示される領域を確認してください。

  • この領域の左上にあるドロップダウンメニューから Hierarchy を選択してください。

  • Time ms の列を選択すると、関数がミリ秒単位の時間によってソート(並び替え)されます。

  • リスト上部の関数をクリックして選択してください。

その関数が物理関数であれば、CPU プロファイラーのグラフ上でその関数が Physics 表示の一部としてハイライト表示されます。この場合は、現在発生しているパフォーマンスの問題が物理に関連していることを意味します。

物理の問題を解決する

パフォーマンスの問題の原因が物理に起因していることが特定された場合に参考になる資料をいくつかご紹介します。

時間の掛かるスクリプト

時間の掛かる、あるいは過度に複雑なスクリプトが原因で問題が発生しているかどうかを確認してみましょう。ここで言うスクリプトとは、元々 Unity エンジン に含まれているスクリプト以外のものを指します。通常これはユーザーが独自に書いたスクリプトになりますが、プロジェクトで使用しているプラグインに含まれるスクリプトなども当てはまる場合があります。

  • CPU Usage プロファイラーをクリックして選択します。

  • In the top part of the Profiler window, where the CPU usage profiler shows data over time, examine the part of the graph that represents Scripts. We can hide or show data in the graph by clicking the colored square next to its name.

時間の掛かっているフレームにおいて、そのフレーム時間の大部分がスクリプトによって消費されている場合は、ユーザースクリプトに時間が掛かり過ぎていることが問題の原因になっている可能性があります。これを確認するため、以下の手順でプロファイリングデータを更に詳しく掘り下げてみましょう。

  • CPU usage プロファイラーが選択された状態で、プロファイラーウィンドウ下部にある、現在選択中のフレームの詳細情報が表示される領域を確認してください。

  • この領域の左上にあるドロップダウンメニューから Hierarchy を選択してください。

  • Time ms の列を選択すると、関数がミリ秒単位の時間によってソート(並び替え)されます。

  • リスト上部の関数をクリックして選択してください。

関数がユーザースクリプト関数であれば、CPU プロファイラーのグラフ上でその関数が Scripts 表示の一部としてハイライト表示されます。この場合は、現在発生しているパフォーマンスの問題がスクリプトに関連していることを意味します。

ただし、例外も存在しますのでご注意ください。Image Effects スクリプトや、OnWillRenderObject 内のコード、あるいは OnPreCull 関数内のコードなど、レンダリング関連のコードがゲームに含まれる場合は、これらは CPU Usage プロファイラーでプロファイラーウィンドウ上部に、Script データとしてではなく Rendering データとして表示されます。

最初のうちは少し分かりにくいかもしれませんが、通常通り Hierarchy ビューや Timeline ビューで関数を調査していくと、原因となっているコードを見つけ出すことができます。

時間の掛かるスクリプトの問題を解決する

問題の原因がユーザースクリプトであることが特定された場合は、パフォーマンスを向上させ得る簡単な方法がいくつかあります。以下に、ユーザースクリプトの最適化に関する情報が提供されているページをいくつかご紹介します。

パフォーマンス問題のその他の原因

以上、パフォーマンスの問題に関して、最もよくある四つの原因について学びましたが、これ以外の要因によって問題が発生する場合もあります。その場合も、上記と同じ方法で問題の分析を試みてください。具体的には、データを収集し、CPU Usage プロファイラーを使って問題の原因となっている関数の名前を特定し、関数の名前が特定されたら、Unity マニュアルや Unity フォーラム、あるいは Unity Answers で該当の関数についての情報と、その負荷を軽減する方法を調べてください。

参考資料

Unity マニュアル イベント関数の実行順

Unite 2012: Performance Optimization Tips and Tricks for Unity(Unity におけるパフォーマンスの最適化に関するヒント)

Unite Europe 2016: Optimizing Mobile Applications(モバイル・アプリケーションの最適化)