コードインスペクション:高負荷なメソッド呼び出し
パフォーマンスが重要なコンテキスト
Unity イベント関数 更新(英語)、 LateUpdate(英語)、 FixedUpdate(英語) は、毎フレーム、または固定フレームレートに一致する頻度で非常に頻繁に呼び出されます。 同様に、コルーチンとして呼び出されるメソッドも、フレームごとに中断および再開できます。 これらのメソッドがゲームのパフォーマンスに影響を与える可能性があることは明らかであり、これらのメソッド内、呼び出すメソッド内での高負荷な操作を認識し、できれば回避することが重要です。
JetBrains Rider は、頻繁に呼び出されるこれらのメソッドおよびそれらから呼び出される各メソッドを、エディターのガター内の行マーカーでハイライトします。 これらのメソッドは、 パフォーマンスに重要なコンテキストとみなされます。 このコンテキスト内で、JetBrains Rider は高コストなメソッドや操作をハイライトするために、 パフォーマンスインジケーターを追加します。
これらのハイライトは、警告や提案のような 従来のインスペクションではありません。コードが「間違っている」わけではなく、コストの高い処理を行っていることが示されています。このようなコードパターンを避けることは、ゲームのパフォーマンス向上につながる可能性があります。 これらのハイライトには簡単な機械的修正方法は通常なく、回避するには書き換えやアーキテクチャの見直しなど、より大きな作業が必要になる場合があります。 本質的には、これらのパフォーマンスインジケーターは高負荷な処理が行われていることを認識してもらうためのものです。 これらの処理を回避するかどうか、またその方法はご自身で判断してください。
これらのパフォーマンス指標は、パフォーマンスプロファイリングの代替となるものではないことに注意することが重要です。 ある操作がコストが高いと指摘されたとしても、現状のコードではパフォーマンスが「十分」である可能性は十分にあります。 常に測定を行いましょう。
高額な手術
JetBrains Rider は、パフォーマンスクリティカルコンテキスト内でよく知られた高コストな操作をハイライトします:
AddComponentメソッドの呼び出しFindメソッドの呼び出しGetComponentメソッドの呼び出しDebug.Logメソッドの呼び出し文字列ベースのメソッド呼び出し
Camera.mainプロパティの使用Unity オブジェクトと
nullの比較
メソッドに上記の高コストな操作のいずれかが含まれている場合、そのメソッド自体が高コストとしてマークされ、これは元の呼び出し元のメソッドに伝播されます。 つまり、JetBrains Rider は、高コストな操作を含むか、高コストな操作を含む他のメソッドを呼び出すメソッドを、高コストな操作としてハイライトします。 例: 次の例が与えられた場合:
次に、すべてのメソッド Update、 DoSomething、 DoSomethingExpensive は、パフォーマンスが重要なコンテキストとしてマークされ、エディターのガターにマーカーが表示されます。 GetComponent の呼び出しは高コストな操作としてマークされ、これが元の呼び出し元に伝播されます。 そのため、 DoSomethingExpensive の呼び出しも高コストな操作としてマークされ、最終的に DoSomething の呼び出しも高コストな操作としてマークされます。
API コールが if ブロックでラップされている場合でも、高負荷とマークされることに注意してください。 編集時点では、 if ステートメントのあるブランチが呼び出される可能性は判断できません。 if はオブジェクトの存続期間中に 1 回だけ呼び出される場合も、全体の 50% の確率で呼び出される場合も、毎回呼び出される場合もあります。 これは、ハイライトが情報提供目的であり、警告として扱われないもう一つの理由です。このコードは間違いではなく、この API コールが高負荷であることを知らせるためのものです。
伝播されたコンテキスト
JetBrains Rider は、 Update や FixedUpdate などのルートメソッドから呼び出されるメソッドにパフォーマンスクリティカルコンテキストを伝播します。 これらのメソッドもパフォーマンスクリティカルコンテキストとして扱われ、高負荷なメソッドをハイライトし、呼び出された他のメソッドにコンテキストを伝播します。 パフォーマンスクリティカルコンテキスト内のメソッドのいずれかが高負荷な API を呼び出す場合、そのメソッドは高負荷であるとみなされ、元のメソッドに伝播されます。 Update 関数は、ネストされたメソッドのいずれかが高負荷な API を使用している場合、そのメソッドを高負荷であるとハイライトします。
メソッドが「頻繁に呼び出される」とマークされている場合は、 Alt+Enter メニューの 受信コールアクションを使用できます。 これにより、そのメソッドを呼び出しているプロセスを確認でき、呼び出しツリーを遡ってルート Update または他の頻繁に呼び出されるメソッドを見つけることができます。
この機能は呼び出し追跡機能に基づいており、非常に巧妙で驚くべき結果をもたらす可能性があることに注意してください。 例: メソッドがデリゲートまたは Action として別のメソッドに渡され、そこで呼び出された場合、そのメソッドは頻繁に呼び出されたものとしてマークされます。
パフォーマンスインスペクションを無効化する
では、高コストなメソッドのハイライトを個別に無効にしたり、インスペクションのすべてのパフォーマンス、 のパフォーマンスインジケーターのガターラインマーカーを無効にしたりできます。 また、 では、これらのハイライトの色を編集することもできます。