How bad is rendering multiple UIs to RenderTexture vs UGUI with multiple Canvas

So we want to make heavy use of UIToolkit to render various things in Worldspace (there are reasons this can’t be just Screenspace).

The solution right now is to have a single UIDocument with its own Panel Setting for each worldspace object (similar to a Canvas in UGUI). Those Panels render to a Render Texture each which is then put as the sharedMaterial texture on a plane primitive.

The questions are:
Does this scale at all? (Maybe not? Probably depends on the render texture resolution. Seems to be using quite a bit of memory if you have hundreds of objects)
Is it horrible Jank to use a ton of Render Textures this way? (Probably yes)
Is this different from what UGUI is doing under the hood (probably no view frustrum culling which is bad in and off itself)?

and last but not least Is there a better way to do this with UIToolkit for non-static UI (for static UI you could just render it once (though I’m also not a hundred percent sure how to force this), copy it to a normal texture and use that then)?

I really don’t want to have to use UGUI for this as I think UIToolkit is just overall a much better and saner system. (Tests seem to show that UGUI doesn’t use any additional memory for additional world space canvases however :/)

You are right that canvas in UGUI do not use any render target, but they still calculate the layout independently for each canvas, so there is a performance drop if you use too many of them on the CPU side in my experience.

The good news is that UI Toolkit is a retained mode ui, so the layout should be less expensive on the CPU if not all element are modified. On the GPU, changing the render target has a fixed cost that is not scalable at all.

You could render them in the same panel, and uses the position of the elements to calculate the required UV to display the element elsewhere. I replied to a forum post on this earlier this week here . Panel Raycaster ignores UI Settings dynamic resolution scalar.

But displaying everything is one part, you also got to make the input works.

I would recommend a reading of the other thread as it may answer a few of your questions.