渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

WaitForSecondsはキャッシュして使おう


f:id:esakun:20150730215258g:plain

Unityで演出をスクリプトでタイミングの調整をしたいときにWaitForSecondsを使ったりすることがあります。
刹那的に使うのは問題ないですが、以下のようにWaitForSecondsを高頻度で生成すると問題が出てきます。

※そもそもこんな使い方はしないやろっていうツッコミは置いておきます

IEnumerator Hoge()
{
    while (true)
    {
        Profiler.BeginSample("## Sample ##");
        var wait = new WaitForSeconds(0.01f);
        Profiler.EndSample();
        yield return wait;
    }
}

f:id:esakun:20180816224842p:plain:w450
このようにGC Allocに20Bほどゴミが溜まっていきます。

これは回避したいので、そもそもWaitForSecnodsをキャッシュしておく方法が考えられます。

IEnumerator Hoge()
{
    var cachedWait = new WaitForSeconds(0.01f);
    while (true)
    {
        // キャッシュしてるWaitForSecondsを使う
        yield return cachedWait;
    }
}

このようにWaitForSecondsをキャッシュして再利用するとゴミが無駄に増え続けることはありません。
※あくまで高頻度でWaitForSecondsを生成するときに使える最適化です。