前提・実現したいこと
メモリ領域を圧迫するSystem.Byte[]が発生する原因を知り、メモリ使用量を低減したい。
発生している問題・エラーメッセージ
Unityにて2Dゲームを製作しており、快適なプレイのためにメモリ使用量の削減に取り組んでおりました。
結果半分ほどに使用量を絞ることには成功したのですが、時間とともにメモリ使用量が増えていきます。
最初はメモリリークかと思ったのですが、各種ツールで見ても原因のクラスを特定できませんでした。
プロファイラの結果も奇妙で、System.Byte[]なる使用した覚えのないデータ型で埋め尽くされていたり、メモリ上限を超えて領域が確保されていたりとおかしなことになっています。
以下で詳しく示させていただきます。
該当のプロファイリング結果
上の画像のようにsystem.Byteがメモリ領域を圧迫しています。
詳細を見てみます。
ただアドレスと容量が書かれているのみで原因のクラスがわかりません。
さらにメモリを圧迫しているデータをデータ型でグループ化して見てみると(起動していなかった)HeapExplorerというプロファイリングツールに由来するもののようにも見えます。
しかしこのツールは起動しておらず、さらにプロファイリングツールを閉じた状態で見ても異常な数値を示しています。
オーバービューにはSystem.Byte[]にあたるメモリ領域を圧迫する要素は見られません。
次に時間経過による肥大前と肥大後の比較をした画像ですが、memorySectionsなる領域が圧迫していることがわかります。
ですので同ツールでその部分を確認しますと、memorySectionsにある最大のデータは以下のような様子になっていました。
試したこと
再起動するとメモリの肥大が元に戻ります。
この特徴がメモリリークにかなり近く見えたので自分のコードからNewキーワードを極力減らし、ボックス化などのメモリ肥大の原因もドキュメントを参照し対処しました。
またnull代入による使用した参照型の解放も行っています。
頻繁に用いるタグ名やプレイヤーオブジェクトなどの参照型のオブジェクトはなるべくStaticな領域に置いておき全コードで共有できるようにもしました。
しかし軽減されることなくメモリ使用量の肥大は抑えられませんでした。
また、メモリ使用量が増えてもGCで減る分や実行間隔ははほぼ変わりません。
補足情報(FW/ツールのバージョンなど)
Unity 2020,3,6f1
MemoryProfiler
Profiler
Heapexplorer
追記
やはりビルドしてみるとメモリ肥大はなかったのでエディターなどの不具合か仕様のようです。
System.Byte[]の正体は杳として知れませんが中身がStringであることからしてエディターのメッセージの蓄積である可能性があるのかもしれないとは思いました。
正直知りたい気持ちはありますが問題はなさそうなので解決といたします。
回答1件
あなたの回答
tips
プレビュー