渲染顺序

Unity排序优先级

  1. 相机 Depth
  2. RendererQueue(0~2500)
  3. 透明物体(UI/特效层) SortLayer
  4. 透明物体(UI/特效层) SortOrder
  5. RendererQueue(2501~5000)
相机

相机的排序一定是最高级,按照相机depth升序渲染,depth越小越先渲染;

RendererQueue 0~2500

在同一个相机之下,优先渲染不透明物体,并按照RendererQueue升序排序,RendererQueue越小越先渲染。

注意:因为有深度缓冲(ZBuffer)和深度检测存在,所以即便是后渲染的物体,如果Z值在先渲染的物体之后,图元依然会被舍弃。因此不透明物体的渲染顺序并不影响其显示顺序, Unity会自行调整其调用DrawCall的顺序。

SortLayer

在同一个相机之下,当渲染透明物体时,优先按照SortLayer进行排序,SortLayer靠前的会被优先渲染。

SortOrder

当相机、SortLayer都相同时,按照SortOrder进行排序,SortOrder低的优先被渲染。

RendererQueue 2501~5000

当相机、SortLayer、SortOrder都相同时, 按照RendererQueue进行排序, RendererQueue较低的优先渲染。

注意: 由于透明物体往往关闭了深度写入, 因此此时渲染顺序将严格按照RendererQueue进行排序。Unity在渲染透明物体时,如果RendererQueue相同,则会严格按照由远及近的顺序调用DrawCall。

Hierarchy顺序

在UI中,以上条件皆相同的情况下,会按照UI在Hierarchy面板中的顺序进行排序。

策略与优化

策略
  1. UI和场景物体分相机渲染,此时场景相机不考虑sortLyaer和sortOrder, UI相机不考虑不透明物体;
  2. 场景中的3D UI, 例如人物头顶的血条等, 可以将Canvas设置为WorldSpace, 并指定场景相机进行渲染,此时UI 将被视为一个透明物体, 渲染顺序与透明物体相同, 默认UI材质RendererQueue为3000;
  3. 场景中的粒子按照其材质RendererQueue排序,但是当RendererQueue>2500之后,改变SortLayer和SortOrder也将改变材质顺序, 即使不是在UI中使用。因此场景中的粒子不建议设置SortOrder和SortLayer,除非希望粒子位于渲染队列的首部或尾部;
  4. UI中的粒子层级与Canvas一致, 使用SortOrder和SortLayer排序即可;
  5. 粒子本身会进行动态合批, 即便使用了多pass的材质, 粒子依然会对每个pass进行合批;
关于UI的优化

由于UI往往按照SortOrder进行排序,因此一旦页面中使用了不同的图集或材质,一定会打断当前页面的合批。

  1. 同一个页面尽量使用同一个图集;
  2. 同一个页面使用到字体材质尽量不穿插在页面中间,而是统一放在UI靠后的位置;
  3. 同一个页面使用到特殊材质的话,尽量放在UI靠后的位置;