Unity UI模块优化(2.优化渲染开销)

参考链接:https://blog.uwa4d.com/archives/1875.html,详情请点击链接查看UWA的视频解析,尊重UWA版权。本文为个人看视频学习整理笔记,同视频有删减。

降低界面的渲染开销

1.Profiling 查看当前UI渲染开销

UI报告中定位渲染开销:
(注:开了多线程渲染后,渲染的开销都藏在子线程里,基本上很难定位。所以在优化渲染开销时,都建立先切换成非多线程渲染然后再优化,优化满意后再开启多线程渲染)

1/ NGUI – Unity4.x
Unity UI模块优化(2.优化渲染开销)_第1张图片

这里的DrawVBO和CreateVBO基本上都是UI导致的开销,所以4.x里还是比较好定位NGUI的渲染开销的。

2/ UGUI – Unity4.x
Unity UI模块优化(2.优化渲染开销)_第2张图片

这里的DrawVBO和CreateVBO也基本上都是UI导致的开销,与上面NGUI不同的是直接在RenderForwardAlpha.Render下。

3/ NGUI – Unity5.3+
Unity UI模块优化(2.优化渲染开销)_第3张图片

同Unity4.x的NGUI只是位置可能不一样,其他一样

4/ UGUI – Unity5.3+
Unity UI模块优化(2.优化渲染开销)_第4张图片

如图中红圈,这个函数表示了UGUI渲染时候的开销,这里面其实也包含了CreateVBO那一部分,所以这个开销如果很高,并不仅仅因为我们的Drawcall很高,还可能因为网格重建很频繁。


2.DrawCall

1/ 前言
UI的Drawcall建议在30左右,渲染开销则会在2ms左右

UI的Drawcall对于渲染开销的影响基本上是线性的,案例如下:

测试数量对纯渲染的影响(红米2)[这些UI是静态元素]:
Unity UI模块优化(2.优化渲染开销)_第5张图片
200个Drawcall大约8ms,目标值:30(~2ms)

同样的在红米Note2(中低端配置)上测试,200Drawcall大约5.1ms。

可以知道:
Drawcall有时候对渲染的影响不会特别的明显,所以在针对UI作优化时,不能把Drawcall最低作为一个优化目标,UI这边的开销并不仅仅是由Drawcall引起的。

2/ 优化界面

UGUI:

  • Z值!= 0的UI元素 (Unity5.x,只能合并hierarchy里相邻的同图集的drawcall)
    Unity UI模块优化(2.优化渲染开销)_第6张图片

  • 未“隐藏”元素(还是会渲染):Null Sprite,Color.a = 0,屏幕外

  • Hierarchy穿插+重叠(下图一般icon一个图集,红点一个图集,红点一般比较大会与旁边的icon重叠,就没办法合并,会先渲染icon1,然红点1,然icon2,drawcall一下子就上去了,所以可以红点单独管理,先渲染所有icon,在渲染红点,如下图,只是红点的位置需要额外的脚本控制了)
    Unity UI模块优化(2.优化渲染开销)_第7张图片
    Unity UI模块优化(2.优化渲染开销)_第8张图片

  • 图集分离(即使我们对纹理都设置了同一个icon,但他有可能还会分成好几个组,这些组就代表了不同的纹理,UGUI里原始的图设置了压缩格式或者使用了真彩,或有些带a有些不带a(透明),他们都会拆成不同的图集,所以可能会:虽然我们把很多纹理放到了一个tag里,drawcall还是非常多,很可能他们在不同的子图集里)
    Unity UI模块优化(2.优化渲染开销)_第9张图片

NGUI:

  • 减少UITexture的使用(因为它不能跟其他东西合并,除非两张完全一样的UITexture;如下图第一个红圈占了3个drawcall)
  • Depth穿插
  • 未隐藏元素:Scale = 0还是会渲染
    Unity UI模块优化(2.优化渲染开销)_第10张图片

3.Mesh.CreateVBO

需要降低网格更新的频率和范围


4.Overdraw

https://blog.uwa4d.com/archives/video_UI.html
- 减少UI层叠
- 遮挡场景时,关闭场景相机
- 不用Image检测事件

你可能感兴趣的:(Unity基础,游戏优化)