ドキュメント

Unity Engine

Unity Engine

コルーチンの分析

Unity プロファイラーでコルーチンパフォーマンスを分析する。
読み終わるまでの所要時間 6 分最終更新 3日前

コルーチンは、他のスクリプトコードとは異なる方法で実行されます。Unity のほとんどのスクリプトコードは、パフォーマンストレース内の特定のコールバック呼び出しの下の一箇所に表示されます。ただし、コルーチンの CPU コードは常にトレースの 2 箇所に表示されます。
  • コルーチンの開始から最初の
    yield
    ステートメントまでのコルーチン内のすべての初期コードは、Unity がコルーチンを開始するたびにトレースに表示されます。初期コードは、
    StartCoroutine
    メソッドが呼び出されるときに最も頻繁に表示されます。Unity コールバックが生成するコルーチン (
    IEnumerator
    を返す
    Start
    コールバックなど) は、それぞれの Unity コールバック内に最初に表示されます。
  • コルーチンのコードの残り (最初に再開してから実行が終了するまで) は、Unity のメインループ内の
    DelayedCallManager
    行に表示されます。これは、Unity がコルーチンを実行する方法が原因です。C# コンパイラーは、コルーチンを戻すクラスのインスタンスを自動生成します。Unity はこのオブジェクトを使用して、1 つのメソッドの複数の呼び出しにわたってコルーチンのステートを追跡します。コルーチン内のローカルスコープ変数は
    yield
    呼び出しにまたがって存続する必要があるため、Unity はローカル変数のスコープを生成されたクラスに上げ、コルーチン中はヒープに割り当てられたままになります。また、このオブジェクトはコルーチンの内部ステートを追跡し、コードのどの時点で、イールド後にコルーチンを再開する必要があるかを記憶します。
これらの理由から、コルーチンの開始時に割り当てられるメモリは、固定オーバーヘッドヘッドアロケーションにローカル変数のサイズを加えた値になります。
コルーチンを開始するコードはオブジェクトを構築して呼び出し、コルーチンの
yield
条件が満たされるたびに Unity の
DelayedCallManager
がそれを再度呼び出します。コルーチンは通常、他のコルーチンの外部で開始するため、実行オーバーヘッドは
yield
コールと
DelayedCallManager
で分割されます。

コルーチンパフォーマンスの監視と向上

Unity プロファイラーを使用して、アプリケーションのどこで Unity がコルーチンを実行するかを検査し、理解できます。これを行うには、ディーププロファイリングを有効にしてアプリケーションをプロファイルします。これにより、スクリプトコードのすべての部分がプロファイルされ、すべての機能呼び出しが記録されます。その後、CPU Usage プロファイラーモジュールを使用して、アプリケーションのコルーチンを調査できます。

Profiler session with a coroutine in a DelayedCall

一連の操作は、個々のコルーチンの数をできるだけ少なくすることが推奨されます。ネスト状のコルーチンはコードの明確化とメンテナンスに役立ちますが、コルーチンがオブジェクトを追跡するため、メモリーオーバーヘッドが大きくなります。
コルーチンがすべてのフレームで実行され、長時間実行される操作に
yield
しない場合は、
Update
または
LateUpdate
コールバックに置き換える方がパフォーマンスが高くなります。これは、長時間実行または無限にループするコルーチンがある場合に便利です。

追加リソース