Unity組み込み時のMiniscriptの書き方。(GC回避)

初めに

今ゲーム開発中なんですが、GCが常に発生していてやべえ!ってなってます。
とはいうものの便利だし、今の所Miniscriptで読み込む文字列を解釈するにはGC必須だし。

ということでスクリプトを書くときの基本方針についてメモします。

状況

  • 記述そのものでGCが発生。すなわち長い記述だとGCの量が多い
  • 組み込み関数を呼ぶと300-400byte程度のGCが発生
  • 組み込み関数分のヒープ確保はどうもキャッシュされるっぽく、
    複数回呼んでもメモリ使用量はほぼ変化しないときがある

基本方針

  • 記述は可能な限りコンパクトにまとめ、処理内容に参照しない記述がないようにする
  • 組み込み関数で数値や情報を取得する場合、内部の変数にキャッシュする
  • 参照や計算はminiscript内部の変数を用いる
    (毎回組み込み関数で参照しない。これは標準で用意されている関数も含む)

コンパイラはなく、最適化がされないため、
処理速度の向上やGC回避に対し、ソースコードの内容がモロに反映される模様。

UnityでのGCヒッチ回避策

  • GC.Collect関数をポーズタイミングで呼ぶ
  • インクリメンタルGC機能を有効にする

GCで利用してるメモリ量の確認方法


//tmp_mem:TextMeshProを利用したTextクラス
public TMP_Text tmp_mem;

//GCにて確保されてるメモリ量を取得する
memory_val = System.GC.GetTotalMemory(false);

//現在利用中のメモリ量を転記する。
tmp_mem.text = "allocated memory : " + ((float)memory_val/1024.0f/1024.0f).ToString() + " Megabyte";

参考資料

【Unityメモ】使用メモリの把握|マカロン【ゲーム開発】|note