Use node remove from viewport
I not saying it shouldn’t be possible but if you’re not aiming at improving core performance it shouldn’t be necessary?
I myself do remove some widgets when they are not needed but however you get your preferred result it should be done in a way where you know what is happening and what you can/cannot do after said action.
I would think the Garbage Collection system would handle it for you?
There’s no explicit destruction call in UMG. If the widgets are either referenced by the ref counted slate widgets, or by the GC’ed UObject system it will remain in memory.
When building a radar with blueprints, it should would be nice to both create and destroy widgets during run time.
Memory leaks are much more likely without garbage collection, as you have to manually destroy everything.
Hopefully this will shed some light on the memory management in ue4.
It is possible to manually initiate garbage collection for a specific uobject if that’s what you would like. (This requires C++ however I believe)
if you still dont know i could show you
Found this thread while trying to solve a UMG problem. I hate to drag it up but directly destroying UMG elements should be a thing.
I currently have a widget that needs to remove itself and its parent from the viewport. There is no way to do this. Parent -> Remove From Parent doesn’t work. There’s no such thing as “remove from viewport” in the engine source. This is an unhandled use case.
Created a little test scenario using the floating combat text tutorial. Spawned 10,000 widgets across the screen from a keypress event, which creates the widget, adds to viewport and does nothing else. Widget on construct event plays its fade anim (deleted the tick event) and binds to animation finished event that calls Remove from Parent. On 1st keypress spawn of 10,000 widgets FPS drops from 55 to 2. After anims finish FPS recovers to 49. On 2nd keypress FPS recovers to 27. On 3rd keypress FPS recovers to 18. This is a strange but repeatable sequence. Without Remove from Parent FPS recovers to 13, then 7, then 4. Remove from Parent performs some kind of cleanup but still leaves the game with degraded performance.
I have this problem with my inventory. Hovering over an object spawns a tooltip, that displays the item and the one equipped. However, UMG is so “intelligent”, that when I remove the equipped item, and hover back over the inventory item, it still displays the equipped item. If I wait for a while, it fixes itself (or if I have a multi-slot item and a slot I didn’t hover over previously, it works perfectly). I would really like to forcibly destroy the former tooltip to get rid of these ghosts widgets.
I have to have all my widgets on a persistant level and was wondering if this code in 4.23 would free up memory
I know this is kind of old, but it doesn’t seem to offer a solution and I was having a similar problem, so here is my solution:
Within the UMG event graph, you can add a node called ‘Remove All Widgets’. It looks like it is private, so you will need to create a function or event (I made an event called ‘SelfDestruct’). This will release all references which in turn will cause the UMG to call ‘Destruct’ (I put a print statement in my Event Destruct to be notified when it happens). This should fix the memory and FPS issues.
Thought I’d add to this as well, for those who may not want to remove all widgets at once. You can just remove your widget from the viewport, set the reference to NULL and then call “Collect Garbage” and it will be destroyed.
Depending on when you call “Collect Garbage”, you might end up hitching the game, though. So unless you’re doing it on a loading screen or something, it would really be better to just hide/unhide widgets as needed and then call “Remove All Widgets” if necessary when you no longer need any of them.
I want to try this but how do you set a variable to NULL with Blueprints?
PS. Who came up with the idea to have an “add to viewport” function but no corresponding “remove from viewport” function?
I don’t use Blueprints for much, but just using the “Set” node for your object and not setting it to anything should do the trick.
And technically “RemoveFromParent” is “RemoveFromViewport” (the latter exists in C++, but it’s just a deprecated version of the former). It works fine provided that you aren’t calling “CreateWidget” over and over again. The main issue this thread seems to be pointing to is that there might be use cases where you really want the widget destroyed and cleared out of memory for performance purposes. Apart from that, I think the current system works fine provided things are set up in a way that works.
You could exec_flow -> ‘Get All actors of class’ specify your widget blueprint as target -> Get array elem -> Destroy Actor.
Widgets are not actors, so finding them as actors won’t work. Neither are they components. They have their own set of management functions.
I did eventually solve this. I think I needed to cast the UWidget type to something else.
This is an interesting topic. Widgets don’t refresh or redraw themselves every frame, they have an invalidation routine and can be set to volatile and things like that. There shouldn’t be much of a performance hit once a widget has been drawn and isn’t doing anything.
In the same way if you collapse a widget, that’s it, it should stop having an effect on performance entirely, because invisible, insubstantial widgets never have a reason to be invalidated again.
Destroying and creating something over and over and putting more work on garbage collection is always a bad idea, definitely try to get some re-use in there.