Hi developers,

As part of our ongoing effort at Roblox to make games run smoothly across all devices, we’ve recently enabled some performance improvements for static UI rendering. Previously, Gui appearances were recomputed every frame. Now, Gui appearances are cached until they change. This means Guis now take less time to render if none of their descendants have changed since the previous frame.

An example Microprofiler capture of a place with hundreds of unchanging SurfaceGuis. The new system saves 1.9 milliseconds on my laptop. This improvement is even more significant on mobile devices.

A Gui’s appearance is cached until one of the following events occurs.

A descendant is added to the Gui.

A descendant is removed from the Gui.

A property of a descendant of the Gui changes.

A property of the Gui changes.

If any of these events occur, the Gui’s appearance will be recomputed the next frame it gets rendered.

I made a quick visualization of events that invalidate a Gui’s cached appearance. The red overlays indicate which object changed, causing the invalidation. The Purple outline overlay on the Gui indicates the entire Gui’s appearance has been recomputed.