参考链接:https://blog.uwa4d.com/archives/1875.html,详情请点击链接查看UWA的视频解析,尊重UWA版权。本文为个人看视频学习整理笔记,同视频有删减。
降低界面的渲染开销
1.Profiling 查看当前UI渲染开销
UI报告中定位渲染开销:
(注:开了多线程渲染后,渲染的开销都藏在子线程里,基本上很难定位。所以在优化渲染开销时,都建立先切换成非多线程渲染然后再优化,优化满意后再开启多线程渲染)
1/ NGUI – Unity4.x
这里的DrawVBO和CreateVBO基本上都是UI导致的开销,所以4.x里还是比较好定位NGUI的渲染开销的。
2/ UGUI – Unity4.x
这里的DrawVBO和CreateVBO也基本上都是UI导致的开销,与上面NGUI不同的是直接在RenderForwardAlpha.Render下。
3/ NGUI – Unity5.3+
同Unity4.x的NGUI只是位置可能不一样,其他一样
4/ UGUI – Unity5.3+
如图中红圈,这个函数表示了UGUI渲染时候的开销,这里面其实也包含了CreateVBO那一部分,所以这个开销如果很高,并不仅仅因为我们的Drawcall很高,还可能因为网格重建很频繁。
2.DrawCall
1/ 前言
UI的Drawcall建议在30左右,渲染开销则会在2ms左右。
UI的Drawcall对于渲染开销的影响基本上是线性的,案例如下:
测试数量对纯渲染的影响(红米2)[这些UI是静态元素]:
200个Drawcall大约8ms,目标值:30(~2ms)
同样的在红米Note2(中低端配置)上测试,200Drawcall大约5.1ms。
可以知道:
Drawcall有时候对渲染的影响不会特别的明显,所以在针对UI作优化时,不能把Drawcall最低作为一个优化目标,UI这边的开销并不仅仅是由Drawcall引起的。
2/ 优化界面
UGUI:
Z值!= 0的UI元素 (Unity5.x,只能合并hierarchy里相邻的同图集的drawcall)
未“隐藏”元素(还是会渲染):Null Sprite,Color.a = 0,屏幕外
Hierarchy穿插+重叠(下图一般icon一个图集,红点一个图集,红点一般比较大会与旁边的icon重叠,就没办法合并,会先渲染icon1,然红点1,然icon2,drawcall一下子就上去了,所以可以红点单独管理,先渲染所有icon,在渲染红点,如下图,只是红点的位置需要额外的脚本控制了)
图集分离(即使我们对纹理都设置了同一个icon,但他有可能还会分成好几个组,这些组就代表了不同的纹理,UGUI里原始的图设置了压缩格式或者使用了真彩,或有些带a有些不带a(透明),他们都会拆成不同的图集,所以可能会:虽然我们把很多纹理放到了一个tag里,drawcall还是非常多,很可能他们在不同的子图集里)
NGUI:
- 减少UITexture的使用(因为它不能跟其他东西合并,除非两张完全一样的UITexture;如下图第一个红圈占了3个drawcall)
- Depth穿插
- 未隐藏元素:Scale = 0还是会渲染
3.Mesh.CreateVBO
需要降低网格更新的频率和范围
4.Overdraw
https://blog.uwa4d.com/archives/video_UI.html
- 减少UI层叠
- 遮挡场景时,关闭场景相机
- 不用Image检测事件