LoginSignup
4
6

UE5 ちょっとまって?!そのcreate widget危険じゃない??

Posted at

端的に言えばGCの話です

現在android向けのアプリをUE5で作っているのですが、デバッグ中にUIを付けたり消したりを繰り返すとどんどんfpsが低下する現象を発見しました。
デバッグコマンドで見てみるとメモリーがかつかつになっていたため調査をした話です。
主にこの問題が起きるのはメモリの少ないモバイルです。

remove系の処理は内部的には破棄されてないぞ!!!

まんまです。remove from parent関数やremove all widgets関数で非表示にすると思いますがこれ、nullptrを代入をしないと永遠にメモリ空間陣取ります!!!
destroy actorとかと同じ感じだと思っていたのがすべての間違いでした。

実際にやってみよう!

Desktop Screenshot 2023.08.04 - 23.09.46.52.png
今回はwindowsデスクトップでの検証です。ue4.27です。
1ボタンを押すとcreat widgetとremove from parentを各50万回実行します
Desktop Screenshot 2023.08.04 - 23.14.33.18.png
widgetはhello world!と書いてあるテキストとキャンバスパネルだけです。

実行してみる

Desktop Screenshot 2023.08.04 - 23.10.20.38.png
実行前は1160MBですが...

Desktop Screenshot 2023.08.04 - 23.10.49.59.png
約3850MBまで増えました!約2.7GB増えました!!

対策してみよう!

Desktop Screenshot 2023.08.04 - 23.10.05.54.png
get all widgets of call関数でtop level onlyのフラグを外すとremoveされたwidgetも取れます。
これをfor each loopで変数に上書きし続け、最後はnoneをセットすることでnull ptrを代入できます!
そしてdelayに0秒を入力すると1フレーム後に処理が走ります。(ue5ならdelay next見たいのがあるはずです)
その後collect gabagel関数を呼ぶことでシステム側で破棄してくれます~

結果

Desktop Screenshot 2023.08.04 - 23.11.07.30.png
約1300MBまで減りました!最初の時よりかはメモリー食ってますが基本的にシステム側で破棄してくれた事が分かります !

まとめ

今回は参照が無く要素もほぼないwidgetでしたから大してメモリーは食っていませんでしたが、複数参照したり特にwidget switcherを使用したりしている場合、そのwidgetの各要素の変数が全てメモリ上に残ったままになるためモバイルではヒッチやfps低下の原因になります。nullptr入れましょう。

4
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6