Unityコロチンコルーチンの最適化



Optimization Unity Corotine Coroutines



コルーチン関数 繰り返し使用します 次のフレームを待っています数秒待ちます状態を待っています その他の関数ですが、これらの機能を実装するコストは、これらの関数を実装するいくつかのクラスをインスタンス化することです。 コルーチン変数

これら コルーチン変数 それらのほとんどは一度だけ使用されますが、同じことを行うため、多くの役に立たない結果になります GC 廃棄物効率。



最適化はこの側面から開始し、コルーチン変数の使用をキャッシュして、同じインスタンス化された変数を複数回使用できるようにし、多数の一時変数の作成を回避して、無駄なGCの無駄なパフォーマンスを回避します。

パラメータを必要としないパラメータの場合 コルーチン変数 、といった WaitForEndOfFrame 、グローバルコルーチン変数を作成します
パラメータを持つコルーチン変数の場合、辞書を使用して、パラメータをキーとしてコルーチン変数を検索します。そうでない場合は、再度作成します。これにより、GCのパフォーマンスの低下を大幅に減らすことができます。



同時に保存したいので コルーチン変数 だからそれはいくつかを生成します メモリ使用量 、使用しない場合は削除し、同じパラメータ(など)を使用してみてください 同時に待っています )コルーチン変数が作成される回数を減らすため。

ディクショナリは、ハッシュテーブル構造を使用してルックアップを効率的にします。これは、実装する複数のルックアップと一致しています。 (HashTableもハッシュテーブル構造を使用しますが、それらを比較するために、より効率的な辞書を選択します。 ハッシュテーブルハッシュテーブルとディクショナリテーブルディクショナリの比較 )。

以下では、これを実現するためにグローバル静的クラスを使用しています。



using System.Collections.Generic using UnityEngine public static class CoroutineObject { //Common Coroutine variable public static WaitForEndOfFrame waitForEndOfFrame = new WaitForEndOfFrame() public static WaitForFixedUpdate waitForFixedUpdate = new WaitForFixedUpdate() / / Need to use the function to obtain a dynamically stored Coroutine variable, using key-value pairs to avoid repeated additions and quick lookups private static Dictionary<float, WaitForSeconds> waitForSeconds = new Dictionary<float, WaitForSeconds>() private static Dictionary<float, WaitForSecondsRealtime> waitForSecondsRealtime = new Dictionary<float, WaitForSecondsRealtime>() private static Dictionary<System.Func<bool>, WaitUntil> waitUntil = new Dictionary<System.Func<bool>, WaitUntil>() private static Dictionary<System.Func<bool>, WaitWhile> waitWhile = new Dictionary<System.Func<bool>, WaitWhile>() / / Get the coroutine variable public static WaitForSeconds WaitForSeconds(float k) { WaitForSeconds tmp if (!waitForSeconds.TryGetValue(k, out tmp)) waitForSeconds.Add(k, (tmp = new WaitForSeconds(k))) return tmp } public static WaitForSecondsRealtime WaitForSecondsRealtime(float k) { WaitForSecondsRealtime tmp if (!waitForSecondsRealtime.TryGetValue(k, out tmp)) waitForSecondsRealtime.Add(k, (tmp = new WaitForSecondsRealtime(k))) return tmp } public static WaitUntil WaitUntil(System.Func<bool> k) { WaitUntil tmp if (!waitUntil.TryGetValue(k, out tmp)) waitUntil.Add(k, (tmp = new WaitUntil(k))) return tmp } public static WaitWhile WaitWhile(System.Func<bool> k) { WaitWhile tmp if (!waitWhile.TryGetValue(k, out tmp)) waitWhile.Add(k, (tmp = new WaitWhile(k))) return tmp } / / Delete the coroutine variable, if a coroutine variable will be used for a long time, try not to delete public static void DeleteWaitForSeconds(float k) { waitForSeconds.Remove(k) } public static void DeleteWaitForSecondsRealtime(float k) { waitForSecondsRealtime.Remove(k) } public static void DeleteWaitUntil(System.Func<bool> k) { waitUntil.Remove(k) } public static void DeleteWaitWhile(System.Func<bool> k) { waitWhile.Remove(k) } / / Clear the coroutine variable public static void ClearWaitForSeconds() { waitForSeconds.Clear() } public static void ClearWaitForSecondsRealtime() { waitForSecondsRealtime.Clear() } public static void ClearWaitUntil() { waitUntil.Clear() } public static void ClearWaitWhile() { waitWhile.Clear() } }

指示:

  • コルーチンで イールドリターン新しいWaitxxxx(xxx) と置換する イールドリターンCoroutineObject.Waitxxx(xxx) 大丈夫です。
  • パラメータ付きのパラメータが適用できないことを確認するときに渡すことができます CoroutineObject.DeleteWaitxxx(key) メモリスペースの消費を避けるために削除してください
  • 使える CoroutineObject.ClearWaitxxx() このタイプのすべてのコルーチン変数を削除します