🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2688閲覧

Unityのメモリ領域のSystem.Byte[]への対処法について

cushionA

総合スコア90

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/05/23 17:10

編集2021/05/25 14:44

前提・実現したいこと

メモリ領域を圧迫するSystem.Byte[]が発生する原因を知り、メモリ使用量を低減したい。

発生している問題・エラーメッセージ

Unityにて2Dゲームを製作しており、快適なプレイのためにメモリ使用量の削減に取り組んでおりました。
結果半分ほどに使用量を絞ることには成功したのですが、時間とともにメモリ使用量が増えていきます。
最初はメモリリークかと思ったのですが、各種ツールで見ても原因のクラスを特定できませんでした。
プロファイラの結果も奇妙で、System.Byte[]なる使用した覚えのないデータ型で埋め尽くされていたり、メモリ上限を超えて領域が確保されていたりとおかしなことになっています。
以下で詳しく示させていただきます。

該当のプロファイリング結果

メモリプロファイラの結果
上の画像のようにsystem.Byteがメモリ領域を圧迫しています。
詳細を見てみます。
Byteの詳細1
ただアドレスと容量が書かれているのみで原因のクラスがわかりません。

詳細2

さらにメモリを圧迫しているデータをデータ型でグループ化して見てみると(起動していなかった)HeapExplorerというプロファイリングツールに由来するもののようにも見えます。
しかしこのツールは起動しておらず、さらにプロファイリングツールを閉じた状態で見ても異常な数値を示しています。

メモリ使用量

次にヒープエクスプローラーによる分析の結果を貼ります。
OrverView

オーバービューにはSystem.Byte[]にあたるメモリ領域を圧迫する要素は見られません。

HeapExplorerによる比較

次に時間経過による肥大前と肥大後の比較をした画像ですが、memorySectionsなる領域が圧迫していることがわかります。
ですので同ツールでその部分を確認しますと、memorySectionsにある最大のデータは以下のような様子になっていました。

MemorySectionsの詳細

試したこと

再起動するとメモリの肥大が元に戻ります。
この特徴がメモリリークにかなり近く見えたので自分のコードからNewキーワードを極力減らし、ボックス化などのメモリ肥大の原因もドキュメントを参照し対処しました。
またnull代入による使用した参照型の解放も行っています。
頻繁に用いるタグ名やプレイヤーオブジェクトなどの参照型のオブジェクトはなるべくStaticな領域に置いておき全コードで共有できるようにもしました。
しかし軽減されることなくメモリ使用量の肥大は抑えられませんでした。
また、メモリ使用量が増えてもGCで減る分や実行間隔ははほぼ変わりません。

補足情報(FW/ツールのバージョンなど)

Unity 2020,3,6f1
MemoryProfiler
Profiler
Heapexplorer

追記

起動直後

時間経過後

やはりビルドしてみるとメモリ肥大はなかったのでエディターなどの不具合か仕様のようです。
System.Byte[]の正体は杳として知れませんが中身がStringであることからしてエディターのメッセージの蓄積である可能性があるのかもしれないとは思いました。
正直知りたい気持ちはありますが問題はなさそうなので解決といたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2021/05/24 08:16

見た感じProfilerのバグか仕様のように見えますが 非developmentビルドでもメモリ肥大化は発生するのでしょうか?
cushionA

2021/05/24 10:08 編集

ご指摘していただきありがとうございます。 僕の方の非developmentビルドという語句についての理解が浅く、追記・修正のお求めに十分な答えを提示することができません。 しかし家に帰ったらよく調べて非developmentビルドの環境で再検証いたします。 不備のある質問をしておいて恐縮なのですが、いま少しお時間をくださるとありがたいです。 すみませんでした。 追記 ただウィンドウズの方でメモリ使用量を見ても21Gとはいかずともかなり肥大化しているので単なるプロファイラーの表示バグなどではないように思います。 仕様かバグか、あるいはメモリリークであるのかはともかく実際にメモリが肥大化していることは間違いなさそうです。 すみません。
cushionA

2021/05/24 16:00

An asset is marked with HideFlags.DontSave but is included in the build: Asset: 'Library/unity editor resources' Asset name: sv_label_2 とりあえずビルドしようとしたのですが以上のバグが解決できず行き詰まっています。 どうやらUnityの素材を利用していることが原因のようですが、使用箇所が特定できずアセットのバグである可能性も考えています(EasySave3などで過去あった事例です) 申し訳ありませんがもう少し時間をください。
cushionA

2021/05/25 13:45

やはりEasySave3が悪さをしていました。 ビルドができたので再起動した後テストを始めます。 遅くなってしまい申し訳ありません。
cushionA

2021/05/25 14:08 編集

詳細な結果は一時間以上は見て後ほど本文にて画像つきで貼りますが、現時点ではメモリの肥大などは見られていません。 (逆に開始時点から10MBくらい減りました笑) おっしゃるとおりエディターかプロファイラーのせいである可能性が大きいです。 もし問題が見られなかったらベストアンサーになっていただきたいのでなにか書き込んでくださると助かります。 一日待っていらっしゃらなかったら自己解決いたします。 一応もう少し監視してみますが先にお礼を述べさせていただきます。 大変ありがとうございます。
guest

回答1

0

自己解決

エディタの仕様であると結論づけました。
ご迷惑をおかけしました。

投稿2021/05/26 06:17

編集2021/06/28 12:48
cushionA

総合スコア90

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問