UGUI的问题,Canvas的Screen Space - Camera和Screen Space - Overlay性能有差别吗?
Overlay用起来不依赖于具体相机,比较方便,但似乎设置UI&Camera的layer culling无效,在移出屏幕后也不会被U3d自动裁剪掉(draw calls不变)。
因此如果用Overlay,在做UI切换的时候不能用layer culling来隐藏;
如果用移出屏幕的方式,依然会有draw calls(以及vs);
如果用SetActive在复杂界面会调用一堆OnDisable比较慢;
如果用Canvas.enabled = false或 GetComponentsInChildren<CanvasRenderer>(),foreach to "CanvasRenderer.enabled = false" + GraphicRaycaster.enabled=false 写起来比较麻烦。
因此切换UI界面时,缓存\隐藏\显示UI界面的正确姿势到底应该是怎样的?
Screen Space - Camera 模式挺好,加特效容易
多相机开销挺小
“Canvas就是画布了,下面挂的UICamera 和 UIForward摄像机。
UICamera 下面挂着所有的uGUI的UI控件,它的深度大于MainCamera。"
关于这两句,如果选择了screen space - camera模式的话,这么做并没有任何实际意义。
因为此时画布应该跟着相机的位置移动。但如果相机是画布的子物体,按照逻辑相机又会跟着画布移动。
这样就造成一个死循环。unity为了处理这个死循环,还特意加了逻辑,让此时相机的子物体的rectTransform部分功能不可用。
真正的项目中不是这样子进行适配的,因为这样子对 stretch 模式的 UI 不够友好,一半选择是根据高度进行适配,这样子制作UI的时候高度上是可以固定的,然后宽度上需要进行自适应,和屏幕的两边进行对齐。
因此真正的使用规则如下:
- Canvas 选择 Screen Space-Camera 模式;
- Camera 设置成正交模式;
- Canvas Scaler 选择 Scale With Screen Size, Screen Match Mode 选择 Match Width Or Height,比例设为1,即只和高度进行适配;
- Camera 的 Clear Flags 选择 Depth Only。