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