Disabling canvas renderer optimization

Unity’s UI optimization tutorial mentions that one way to optimize hiding parts of the UI would be by Disabling Canvas Renderers.

However, they don’t exactly say how this should be done, and I haven’t found that on the current documentation for Canvas Renderers or the legacy one (since this tutorial was checked with Unity 5.3).

The only thing they say is that what should be done is to

[…] place the UI to be shown/hidden onto its own Canvas or Sub-canvas and then to merely enable/disable the Canvas Renderer component attached to that Canvas or Sub-canvas.

Is there a way to actually enable/disable the Canvas Renderer component or is there another optimized way to stop rendering UI Graphic components from a Sub-canvas without discarding VBO data?

I know that I can hide the UI objects by disabling the Canvas, disabling the GameObject or setting the Canvas Group alpha to 0, but I really need to make a WebGL build as optimized as possible, since the client needs it to run on an iPad, so please help me if you can.

Thanks.

4 Answers

4

It’s as simple as disabling the Canvas component, as it’s the thing that’s handling all the rendering of the UI.

Did a test with thousands of Canvas objects, and it did increase the render time by around 1ms for me, and disabling the Canvas component removed that delay.

Hi,

not 100% sure on this but try:

Canvas c;
c.GetComponent<CanvasRenderer>().cull = false;

The problem with this is that this doesn’t seem to propagate to the children so you may need to individually reference their canvas components although I don’t know if this will be faster. It may be a Unity issue at this point you never know. I tried it on 5.2

Nice,

This did the trick for my dynamic scroll list filled with score views and Facebook picture.

I don’t think exist a way to disable “Canvas Renderer”.

you can log the dirty state change by call “RegisterDirtyLayoutCallBack” or “RegisterDirtyVerticesCallBack” on Awake

and you can find out that
“CanvasRenderer.cull = false” or “CanvasRenderer.SetAlpha(0)”
still cause a dirty.

The UI optimization tutorial said that

“One possible, but hacky, workaround
is to place the UI to be shown/hidden
onto its own Canvas or Sub-canvas and
then to merely enable/disable the
Canvas component on this object.”

So the poper way to do that is create a Canvas Component and disable it.