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

初めに

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

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

状況

  • 記述そのものでGCが発生
  • 組み込み関数を呼ぶと300-400byte程度のGCが発生
  • 値の確保(変数に格納する)際は更に大きくGC発生する
  • また、値確保する際は呼び出した回数分GCが発生する

基本方針

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

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

メモリ確認方法


//tmp_mem:TextMeshProを利用したTextクラス
<div>
<div> public TMP_Text tmp_mem;</div>
</div>
//GCにて確保されてるメモリ量を取得する

memory_val = System.GC.GetTotalMemory(false);

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

参考資料

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