做优化了解3个点:
CPU:drawCall 物理组件 GC 代码运行效率
GPU:减少绘制数目,优化显存带宽
内存:unity内部内存,mono托管内存
UGUI可优化的性能 总结一下有下面几个吧:
1.网格重建
2.合批 节省drawcall
3.填充率( overDraw像素重新绘制)
网格重建(两个网格重建:单个UI,合批完的整体UI网格)(CPU优化 canvas脚本的算法)
网格重建就是ui有修改 需要重新绘制网格
如果是单单重新绘制当前UI性能还没什么消耗 但往往为了节省drawcall我们都会搞合批这个东西
但搞合批 就是把能合批的UI都做成一个网格 这样就会导致一个ui修改需要重新绘制整个合批网格 性能消耗还是比较大的
那这里应该怎么优化呢 这就需要了解合批的一些东西了 Canvas 是 负责管理UI渲染和合批的
实际开发中大多数游戏都可能是存在多个UI界面的:普通的界面,弹窗界面,弹窗界面可能还能出来一个提示窗口(恭喜获奖,确认界面)
如果说所有界面都用一个canvas 重建网格的消耗可以说是非常大的是吧 那我们可以用好几个Canvas
这样就可以减少网格重建的性能消耗 但这样也会增加drawcall
所以用几个canvas还是要看项目的需要 一般控制在5个左右最好
合批(CPU优化)
合批的基本规则:depth 是否大于 等于0,materialID一样, textureID一样,两个渲染的图片中间没有任何图片
特殊mask合批:如果和另外一个mask的materialID, textureID一样 mask的子物体也能合批 但不能相交
rectMask2D: 比mask更节省性能 本身并不占用drawcall 被裁剪的部分不会计算顶点 和其他mask的子物体是没办法进行合批的
而想要不同的图片materialID一样, textureID一样 这就是图集的作用了
动态打图集 优化没办法把资源都放到一个图集里面的资源 例如有100个英雄头像 就不适合打图集了 太大了 就可以通过动态打图集链接: link
填充率(GPU优化)
填充率: Fill Rate(填充率)是指显卡每帧或者说每秒能够渲染的像素数
overDraw 一个像素被多次绘制 会导致填充率不够用导致的卡帧 或者CPU和GPU的占用率过高
最低版本2018.4.26!!!
1.有空边透明的图片:
方法1:图片资源的spriteMode设置为 polygon然后设置一下图片实际显示的区域
方法2:TexturePacker插件 比unity自带的算法要好,计算出来的东西比unity顶点要少
(但设置完后 还得设置一下image的UseSpriteMesh 最低版本2018.4.26,或者可以自己重写image 有地址.) 设置这个需要注意的是:顶点数会增加 需要权衡一下CPU和GPU优化哪个合适一点
2.不需要显示图片但需要有射线点击事件:
把透明度调到0 开启Canvas Renderer的Cull Transparent Mesh