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

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