コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】GC の発生を抑える ~リストの操作編~

概要

var list = activeThings.FindAll( c => !c.IsEnable );
list.ForEach( c => Destroy( c.gameObject ) );
activeThings.RemoveAll( c => !c.IsEnable );

無効になったオブジェクトを Destroy して
リストから削除する処理を LateUpdate 関数に記述したところ、
毎フレーム 72B の GC Alloc が発生して
ときどきゲームがカクつく状態になった

下記ように for や if を使用するベタ書きに変更したところ
GC Alloc は 0B になってゲームがカクつかなくなった

for ( int i = 0; i < activeThings.Count; i++ )
{
    var thing = activeThings[ i ];
    
    if ( thing.IsEnable ) continue;
    
    activeThings.RemoveAt( i );
    Destroy( thing.gameObject );
    i--;
}

関連記事