原理:UGUI 是基于Canvas来进行合并计算的
1.不同Cavans的UI元素,是无法合批渲染,无法实现同一个drawcall
2. 每次合批的时候,会合并计算Canvas下所有的UI元素 , 具体流程:
Step1: 对Cavans下所有的UI元素进行合批计算
Step2: 每帧将合并后的结果提交给GPU渲染
Step3: 当某个UI元素改变以后,先计算某个UI元素改变后的数据,再结合其它UI元素,重新合批 (即:某个UI变动,导致mesh重建,全部重新合批计算)
3. 每次UI元素的位置等相关信息改变,都会引发重新合批计算
4. 静止不动的UI的合批计算开销最小,如果Cavans下所有的UI元素一旦创建都不再改变,则只会产生一个合批计算,性能最好
5.当Cavans下有不断变化的物体时,每次都会重新进行合批计算,此时不动的物体少,那么最后合批的时候物体的数据就少
由上面的分析,就得到一个结论: 动静分离,将不变的物体放一个canvas下, 变化的物体放一个canvas下,优化合并时候的开销
因此很多人就推导出一个结论: 每个界面一个Cavans,减少Mesh合并的开销
但是事实并非如此
基于多Canvas的”动静分离”会打乱合批,能节省的是合并时不变的元素的数据copy
Unity UGUI 会基于Canvas将能合并的UI元素,计算合并到一起,然后再提交给GPU渲染来节约Drawcall
在这个过程中,如果某个UI元素改变了,就会引发一次合并计算。
”动静分离”一般指的是把那些不经常动的UI与经常动的2D元素分成不同的Cavans,来减少合并时候的开销。这个通常叫做”动静分离”。
我们在开发项目的时候,会把经常变化的游戏元素(2D游戏角色,玩家昵称,玩家血条等)做到一个Cavans下,把通常的游戏操作UI界面做一个Cavans下,对于那些UI内容非常多的如”任务滚动列表”等,我们也会考虑单独做一个Cavans,然后持续监测UI性能即可
一般项目中2~3个Cavans就可以了,还是要把重点放在UI的drawcall优化上