以下の内容はhttps://baba-s.hatenablog.com/entry/2019/12/25/082000より取得しました。


【Unity】ローカル変数をキャプチャする場合、その処理が実行されなくても GC Alloc は発生する

概要

using System.Linq;
using UnityEngine;

public class Example : MonoBehaviour
{
    private static  string [] m_list = 
    {
        "フシギダネ",
        "フシギソウ",
        "フシギバナ",
    };

    private void Update()
    {
        var name = "ピカチュウ";

        // ここで return するので
        return;
        
        // ここの処理は実行されない
        var result = m_list.Where( c => c == name );
    }
}

例えば上記のようにローカル変数をキャプチャする処理を書いたとして、
そこの処理に到達する前に return したとしても、

f:id:baba_s:20191224105327p:plain

GC Alloc は発生します

対策としては、

using System.Linq;
using UnityEngine;

public class Example : MonoBehaviour
{
    private static  string [] m_list = 
    {
        "フシギダネ",
        "フシギソウ",
        "フシギバナ",
    };

    private void Update()
    {
        var name = "ピカチュウ";

        // ここで return するので
        return;
        
        // ここの処理は実行されない
        Hoge( name );
    }

    private void Hoge( string name )
    {
        var result = m_list.Where( c => c == name );
    }
}

このように変数キャプチャしているコードを別の関数に分けることで

f:id:baba_s:20191224105401p:plain

GC Alloc は発生しなくなります

参考サイト様

https://www.slideshare.net/xin9le/dotnetperformancetips-170268354




以上の内容はhttps://baba-s.hatenablog.com/entry/2019/12/25/082000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14