-
DrawCall
Drawcall优化必须先了解一下drawcall怎么生成,才好优化
Drawcall问题其实可以说同一个图集的图形网格能否合并的问题(ps:字体其实也是个图集)
举个例子
图集:理解为不同颜色的油漆
Drawcall:理解为刷油漆次数,每次只刷一种颜色油漆
可以看看下图如何刷油漆,每次刷颜色都要刷满整个网格
渲染步骤
总结
用同一个图集的一堆图形中间没有其他图集的图形穿插,这堆图形不管怎么排版都不会引起额外drawcall,否则都会引起额外drawcall
Drawcall问题其实可以说同一个图集的图形网格能否合并的问题
-
查看工具
1.使用framebug查看渲染流程,必须运行中看,点一下drawmesh可以看到使用的图集
2.Scene视图查看网格
-
常见优化方向
1.空的image和透明的image(有自带sprite调颜色透明)都改掉换成EmptyRaycast
这两种都会引起drawcall,rawimage也一样处理
2.尽可能不用mask或者mask2d(有些必须用的没办法),这个会引起drawcall无法合并
3.Ui排版这个有点泛(这个主要看framedebug和网格来查)
例如:一个有选中状态的标题
里面的节点是底图-》文字-》选中框 这种渲染顺序有三个drawcall
不影响显示的情况调成
底图-》选中框-》文字 这样就变成两个
这种情况很多时候被忽略,其实拖一下就能优化一个drawcall
4.资源适当冗余可以减少drawcall
例如:战斗界面用到一个公用图集的设置按钮,如果我把这个设置按钮复制一份到战斗图集里面,这样子战斗界面能优化一次drawcall,对内存和包体影响不大
5.图集整理
注意:一张图集最好不要超过2048,不然会分成两张图集
6.一些复杂的ui适当加canvas
例如:战斗界面和小地图都在一个canvas里面,这是这两个界面会进行合并,这个小地图如果有些特殊东西导致战斗界面部分无法合并可以试着加个canvas,而且小地图重建比较多,加个canvas也是比较稳的
正常来说canvas会增加drawcall,不过有时候遇到复杂界面,导致无法合并,加个canvas可以减少drawcall
7.字体尽量用一种就够,稳的话用大厂字体,推荐使用思源
其他特殊的做成图片
-
关于重建
什么引起uirebuild,可以理解为整个ui就是一个网格,凡是引起网格改变就要rebuild
例如ui移动位置,大小改变,文字改变这些都会引起rebuild
根据重建的频率来处理,尤其战斗中的小地图,飘字,血条,都是网格重建最多的
这些可以单独抽出一个canvas
RayCast
屏蔽没必要的raycast也是性能消耗