How to detect memory leaks in Unity? Memory Profiler and Leaked Managed Shells

  Рет қаралды 13,684

Unity Japan

Unity Japan

Күн бұрын

0:00 Intro
0:19 Leaked Managed Shell
2:24 "Fake null" in Unity
3:54 Detecting them on Memory Profiler
5:35 Huge memory leaks
6:58 Fix and verification
8:04 Summary

Пікірлер: 35
@noname-hg8ke
@noname-hg8ke Жыл бұрын
これまで何回も修正が検討されたうえで、修正が叶わないというのが悲しい
@SwatHound
@SwatHound Жыл бұрын
I wish all of my unity content was done by you. This was a very enjoyable video. Your explanation, the background music, the pacing. It was all wonderful.
@user-cx3ze2cn8w
@user-cx3ze2cn8w Жыл бұрын
あんまり興味ない話題だったけど解説が上手くて最後まで見てしまった… コードを暗くしたりアニメーションさせて1個ずつ説明するのすごくわかりやすい…
@sooiv3572
@sooiv3572 Жыл бұрын
本当に便利で必須の情報でした。 Unity Japanは最高のチュートリアルを提供しています。
@CzarZappy
@CzarZappy 3 ай бұрын
Wow I didn't know you could search for "leaked" in the Memory Profiler to find leaked managed shells. Thank you for this video, very insightful!
@negitoro5293
@negitoro5293 Жыл бұрын
Unityのガベージコレクシ下でリークが起きうるメカニズムが分かりやすい解説で理解できました
@studio_shimazu
@studio_shimazu Жыл бұрын
とても参考になりました! ありがとうございます!
@denosoft
@denosoft Жыл бұрын
Unity環境でもメモリリークが起きうることを知らなかったので勉強になりました
@ZiplawDev
@ZiplawDev Жыл бұрын
ACTUALLY the better unity channel, this is crazy good
@lmao01
@lmao01 Жыл бұрын
Thank you for this and eng subtitles.
@SirDMX
@SirDMX Жыл бұрын
Thank you very much, awesome video!
@armint9109
@armint9109 23 күн бұрын
Thanks! Unity Japan is so good!
@nswell1074
@nswell1074 Жыл бұрын
Thank you! I love your sharing!!
@yuzukimac
@yuzukimac Жыл бұрын
本当は怖いUnityみたいな感じで面白かったです🥶👻
@simplestar-game
@simplestar-game Жыл бұрын
参考にします
@uni-mal4433
@uni-mal4433 Жыл бұрын
めちゃくちゃ大事で勉強になる動画でした。 頭が痛くなる問題ですが、メモリ・プロファイラーが正式版になったのが救いですかね。 ありがとうございます!
@user-hy9gi4ig4l
@user-hy9gi4ig4l Жыл бұрын
Thank you!!!
@FujiSunflower
@FujiSunflower Жыл бұрын
こんなに重要な情報はスクリプトリファレンスのDestroyの項目に書いてくれ
@Cafecafeoore
@Cafecafeoore Жыл бұрын
とても勉強になります♩ メモリリークの解消も軽量化に入るのかな?個人的には軽量化関連もっと見たいです♩
@town4957
@town4957 Жыл бұрын
エンジニアではない私には難しい話だったけど、何とかついていけたと思う(思いたい)^^; いつもありがとうございます。
@SlimeMeteor
@SlimeMeteor Жыл бұрын
とても参考になる動画です、助かるます、ありがとうございます。 ちなみに、Unityの中で leak しません、 でも iOS (IL2CPP) にビルドのは leak が発生する、 この現象はどんな原因でしょうか?
@yuki2006_kd
@yuki2006_kd Жыл бұрын
解説動画に見せかけて、Unityのヤバいところに付き合ってください動画...
@kuippam
@kuippam Жыл бұрын
まじでえええ!!? nullの明示的に代入が必要だなんて、はるか昔あったようななかったような・・・。 箱庭系RPG、Valheimとかで追従するペット(長時間破棄されない)を増やしたりすると、ゲームが激重になって、インスタンスも増えてるしメモリがゆるやかに漏れてるなぁーって思ってた。数時間のプレイなら気にならないけどオブジェクト数を増やすと破綻するパターン。nav meshみたいな経路探索AIが複数走ってAgentがぶつかりあって掴んでるんだろうとおもってたけど、単にオブジェクトのDestroyだけでは駄目でnullをぶっこむ必要があるとか、罠すぎない?同じような挙動をするゲーム多いから多分気がついてない開発者山程いそう。Destroy()、Clear()のスクリプトリファレンスに書いておいておくれよ・・・。もしかして音バグと呼ばれるところにも同じ原因か。破棄すると挙動がおかしいから再利用に回してたが・・・
@lise3647
@lise3647 Жыл бұрын
動画内で「MyComponentのOnDestroyでTexture2Dを明示的にDestoryしたほうがよいでしょう」とあるんですが、 MyComponentそのものがDestroyされたら参照がなくなるので、 MyComponentが管理していたすべてのManaged shellもnative objectも消えると思ったんですが、残ってしまうんでしょうか? (動画内で実際にLeaked Managed Shellを確認して消えていた理由はListをClearしたからと思っています)
@UNO-yc1xk
@UNO-yc1xk Жыл бұрын
初学者の身ではサンプルを読み解くだけで難しい…… コンポーネントのInstantiateって何が起こるのとか、Destroy(o.gameObject)した時今回の話抜きにそもそもoはどうなるんだろうとか ChatGPTに教えてもらってなんとか理解しました
@asreia
@asreia Жыл бұрын
C#からC++を参照しているのはm_CachedPtr Destroy()を呼ぶと即時にC++データを破棄する
@ruinzu403
@ruinzu403 Жыл бұрын
んー?MyComponentクラスで配列やテクスチャが放置されるくだりがよくわかりませんでした わざわざOnDestroyでnullを突っ込まなくてもMyComponentクラスがDestoryされた際にどこからも参照されてなければMyComponentクラスそのものがGCで回収されるので フィールドにnullを突っ込まなくも自動的にGCによって回収されるのではないですか?
@user-or2gc4wo8p
@user-or2gc4wo8p Жыл бұрын
これには若干の前提知識が要求される話で UnityC#はフロントエンド実装でしかなくコア実装がC++側にある(ここは解説に含まれています。)点です 一瞬動画中に登場したのですがUnityのフロントC#実装にあるUnityEngineObject.bindingsクラス にあるCompareBaseObjects(UnityEngine.Object lhs, UnityEngine.Object rhs)で”NULLの定義自体”をオーバーロードしています。 (この点も一応動画で一瞬サラッと説明されています) (さらにどうでもいい説明をするとCompareBaseObjectsは同値確認,C#でいうところのequals()的な奴も兼ねてます) (Unityのフロント実装はGithubで読めるので興味あればクラス名でググると読めます) じゃあCompareBaseObjectsは更に何をやってんだって話ですが,内部でGetCachedPtr() というメソッドを叩いてIntePtr.Zeroかどうかを確認しているだけです。 IntPtrはネイティブコード側のポインタを格納する型で,UnityObjectの実態とも言えます。 つまりC++側との参照が切れてるかどうかでNULLを返しているだけなので実態としてはNULLではなく参照が切れていることを表現している実態が残ります。 なので実際のNULLではないという理屈です。 そしてNULLが代入されてない以上元々参照を持っているクラスとの参照がやはり残ってしまうのでgcも走りません。 Unityの型の多くの実態はC++実装のポインタを持ってるだけです。 VS2019とかのデバッガーでも基底クラスを追っかけてm_CachedPtrとか見ると実際の値を確認できます。 やはりあくまでもC#の皮を被ったC++プロダクトなんだなと実感できます。  じゃあintPtr.Zeroになったら自動でgcが適用されるべきだろ?とは私も思うんですがどうもそこが上手くいかない理由があるようです、パフォーマンスなのかメモリ安全の保証が困難なのかはわかりませんが・・・ NULLの実態を隠蔽するするのはいいとして、Playerloopを一周回して破棄したら自動でC#側のマネージドコードもnullを突っ込んでgc送りにする専用メソッドぐらいは整備してもいいのにとは思います。 まあもうUnity自身が20年モノの巨大プロダクトと化しておりIL2CPPとかとのも絡みもあって膨大な依存関係を修正することはもうどうしようもなく不可能な状態なのでしょう・・・
@ruinzu403
@ruinzu403 Жыл бұрын
@@user-or2gc4wo8p 長文で解説して頂いて恐縮ですが、論点がズレてます 私はUnityのnull偽装については一切言及してません。MyComponentのOnDestroyの必要性について伺っています
@yuki2006_kd
@yuki2006_kd Жыл бұрын
Unity公式の見解も知りたいところですが、サードパーティのライブラリなどの実装がしょぼくてDestroyを呼ぶだけで参照を解放してなかった場合の対策と読みました..
@user-or2gc4wo8p
@user-or2gc4wo8p Жыл бұрын
​@@ruinzu403 ああ理解しました、深夜テンションで先走ってしまい失礼しました。 ああ恥ずかしいので後で消しますねw UniRXのAddto()みたいにアンマネージドメモリは全部デストラクタやOnDestroy()で破棄する習慣をつけましょうね程度のものだと思うので あんまし深い意味はないように思えます。 ただ例としては混乱を招く気はするので普通にButtonEventとかで破棄とNULL代入をしたほうがデモンストレーションとしては適切だと思いますね。 動画の締めでも長時間残ってるオブジェクトで顕在化する問題だと明言しているのでご指摘はたぶん妥当なものだと思いますが 一方で明示的な破棄をするにはNULLを代入するしかやりようがないという最大の論点には特に関係ないので割と不毛な論点かなと?とも思います 極端な話PCをシャットダウンすればメモリ開放されるから気にしなくていいよねと話に近いです。
@yuki2006_kd
@yuki2006_kd Жыл бұрын
nullを代入しろというのはネガティブなインパクトがありますが、落ち着いて考えると理解はできなくはないと思ってきました。 1. まずDestroyが呼ばれたら、見かけ上 nullと表示されてしまうのはUnity側の修正を望みます。 2. ここでメモリリークと言われるのは、(主にフィールドで)保持しているオブジェクトをDestroyしてもC#的にそのまま保持されてしまう問題だと思いますので、 プログラマの方はDestroy呼んだとしてもそれだけで安心せずに変数の参照を消しましょう。 例えばローカル変数の場合は自動的に消えるはずなので null を代入しなくて良いというものだと思います。 (リストに参照がある場合などはもちろんクリアする) 逆にいうと、経験が長いプログラマは、参照をわかっているはずなのでこの動画をもって何かを気をつけるというのはないかもしれません。 (1. の挙動だけ気をつければ←これが厄介ですが)
@nthdthdyjsehsnw4ethwbt
@nthdthdyjsehsnw4ethwbt Жыл бұрын
初心者殺し過ぎるww
@SakuraCrowd
@SakuraCrowd Жыл бұрын
Unity エンジンでメモリリークが発生しやすい状況を放置しておいて、その言い方はどうなのか。 Destroy 関数で破棄したと思わせておいて実はあるんだよねってインテリぶって語られてもちゃんと直してほしいとしか思わない。
@sagat64
@sagat64 10 ай бұрын
Unity はこういう落とし穴多すぎて大嫌い 公式のトップに書いておけよ
Your First Encounter with Unity ECS: A Basic Tutorial
14:52
Unity Japan
Рет қаралды 18 М.
Let's try UI Toolkit - First half
14:37
Unity Japan
Рет қаралды 9 М.
Задержи дыхание дольше всех!
00:42
Аришнев
Рет қаралды 2,7 МЛН
50 YouTubers Fight For $1,000,000
41:27
MrBeast
Рет қаралды 195 МЛН
Эффект Карбонаро и нестандартная коробка
01:00
История одного вокалиста
Рет қаралды 9 МЛН
Memory Profiler Walkthrough & Tutorial | Unity
13:51
Unity
Рет қаралды 6 М.
11 Techniques to Accelerate Placement
27:57
Unity Japan
Рет қаралды 18 М.
Unity remote development experience with Parsec
6:17
Unity Japan
Рет қаралды 8 М.
Exploring C# async/await support in Unity 2023.1
7:43
Unity Japan
Рет қаралды 9 М.
Three types of UI masks and their uses
10:31
Unity Japan
Рет қаралды 7 М.
New Features and Improvements! Unity 2022.2 Physics Updates
6:41
BEKMOBILDA Tecno Camon 30 smartfoni🔥🤩 #bekmobil
1:01
Bekmobil shorts
Рет қаралды 2,3 МЛН
Лазер против камеры смартфона
1:01
NEWTONLABS
Рет қаралды 691 М.
Что делать если в телефон попала вода?
0:17
Лена Тропоцел
Рет қаралды 2,6 МЛН
АЙФОН 20 С ФУНКЦИЕЙ ВИДЕНИЯ ОГНЯ
0:59
КиноХост
Рет қаралды 1,1 МЛН
iPhone 15 Pro в реальной жизни
24:07
HUDAKOV
Рет қаралды 442 М.