Download

[4.10] UMG Widgets stop ticking and/or drawing for Clients in Multiplayer.

(Posting here because I currently can’t access answerhub). I have been having issues with my UMG Widgets since moving to 4.10 which only seems to occur in Multiplayer.

If there is the slightest hiccup, packet loss or break in communication between server and client or if the client stalls for too long - all user widgets for the client stop ticking. For me, this has also caused them to stop displaying (which I don’t understand, since I’ve never told them to do that). The widgets are still around, and are not GC’d, but they don’t draw or tick. There have been no mentions in the 4.10 release notes of stricter ticking, but I have so far found several changes to networking code that aren’t documented in those notes, and am worried that this is one of them.

It’s relatively easy to trigger this, I have a widget the the HUD adds to the Clients window on BeginPlay(). That widget is always in play for the entire game and is never removed. Doing network heavy tasks like taking possession of a different pawn (in my case, hoping in or out of a vehicle), or even when the client first joins the match causes this behavior. The only common thing I can see here is that the Pawn changes when this happens, but why would that be an issue?

Child widgets still remain in the viewport, but unless the parent tells them too then they also aren’t ticked.

The only way to get around this right now, is to Force-Tick the widgets by calling an Update function on them in DrawHUD. This is not ideal since it completely overrides the point of the slate optimizations that have been put in recently, and means that all widgets tick regardless of whether they’re on screen or not or even visible or not. What’s worse is that widgets that ARE on-screen are then ticked twice, both by NativeTick() and the call from the HUD.

My game isn’t doing anything special nor at any point does it tell that widget to hide itself, so I can only guess this is due to an engine change, but it seems like quite a breaking change. I don’t have a project to hand that can easily demonstrate this without giving all my source code away, but I’m sure it’s easy to create one that will do the same thing.