embed:tips1
Unity上でGCによるStopTheWorldを抑えるための工夫
今ゲーム開発中なんですが、GCが常に発生していてやべえ!ってなってます。 とはいうものの便利だし、今の所Miniscriptで読み込む文字列を解釈するにはGC必須だし。
ということでスクリプトを書くときの基本方針についてメモします。
状況
- 記述そのものでGCが発生。すなわち長い記述だとGCの量が多い。
実際はコンパイル後のTACが格納されるためコメント行等は削除されるが、それでもデータはstring型で持っているため、長い記述は避けるほうがいい。 - 組み込み関数を呼ぶと300-400byte程度のGCが発生。delegate先の記述で変数の確保方法によっては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
embed/tips1.txt · 最終更新: 2024/05/04 11:20 by machiaworx