Unity UGUi优化分享及注意事项
此篇为之前学习UGUI源码的网易云笔记,现整理发出来供大家参考。更新时间:2019年12月19日21:22:49
1. GameObject.SetActive 尽量少使用。
因为在OnEnable 和OnDisenable 都会重新设置一遍所有的脏标志. 尤其不要对大量的 text 进行 setactive。单个UI建议使用 canvas renderer的.cull属性。如果多个UI建议使用canvas group中的alpha 设置0。2. 尽量少使用Layout。
3. UI合批需要注意材质是否一样,图片ID是否一样。
4. Mask有2个dc (1设置模板缓存 2还原模板) 且不能合批 而且会打断上下UI合批 。但是Mask与Mask之间可以合批 ,Mask子物体可以合批
5. Mask2D 不占用dc, 可能是底层算出来的顶点渲染区域,然后渲染Mask,但是 Mask子物体不能和其他子物体合批,只能自己下面的子物体合批 。 另外Mask2d 本身上的 image 却可以合批
6. 填充率Overdraw 优化 : 掏空中间不用的UI,尽量减少UI大小。减少UI重复区域
7. 平铺类型的操作不要用Image 要用Rawimage
8. Raycast 不用就关掉,Unity 默认是开启的,但是有很多UI不需要接收点击事件
9.动静分离原则,创建子Canvas 让动态的UI单独一个Canvas这样不会重新绘制mesh,但这个Canvas会打断合批。建议写代码动态加载Canvas,而且Canvas不要太多,会增加dc.这个根据需求抉择
10.UI 上的的Color属性 不建议直接修改,修改会导致重绘mesh,建议修改材质球颜色不会出现这个问题
11. Text 尽量不使用 BestFit 自适应。(TextMeshPro建议使用这个插件制作Text)
12.打图集的目的就是为了 UI合批的时候 判断图片ID一样,然后合批。
13. Unity 旧版本图集 在resources 是不能打图集 注意图集标签不要出错
14. Unity 新版本图集 2017以上 有个设置Variant 类似继承关系,可以继承父图集的设置,可以用来制作根据分辨率不一样 生成图集。
15.在Loading界面使用动态打图集技术 可以很大的优化DC。但是动态打图集很增加Loading时间。
16.设置UI点击其他区域退出当前UI这样的类似功能 会产生大量Overdraw,最好的方法写个代码 继承Image 重新 OnPopulateMesh 方法,只写一行 tofill.clear();就搞定了
17 Sprite导入 UI一般关闭 Read/Write 和 Generate MipMaps
动态打图集算法
Github: unityRuntimeSpriteSheetsGenerator图片压缩格式选择
1. 安卓主要用RGB ETC 4bit 不支持A通道,如果透明 用ETC2 8bit 或者 再用一张ETC 1通道
2. Crunched 是untiy的二次压缩方式,缺点就是压缩时间过久
3. IOS主要用 RGBAPVRTC4 其次选用 SATC
4. 大部分压缩格式要求 宽高是2的整数次幂(POT) 或4的整数倍数.如果不能满足,就单独打图集
5. 安卓 RGB ETC4通道分离 split alpha channel。要注意在Project setting中graphicsshader 中添加 DefaultETC1。否则在真机可能出错 。或直接用ETC2(优先选择)打图集的规则
1. 尽量把同一个界面放在一个图集
2.尽量不要把同一个图放在多个公用图集
3.使用频率高的图 放在一个图集
4 大图UI尽量不打进图集
5建议使用插件打包图集,效果会略微比Unity自带的图集打包好一点。节省空间很大一点 UI 合批流程
1 遍历UI
2 合批测试(当前UI会判断底下UI是否可以合批 如果不合批深度底下最大的+1)
2 判断顺序 如果深度一样 然后判断材质是否一样再判断 图片是否一样 最后再根据面板顺序排序,如果深度为-1 则不渲染
3 得出排序数组看相邻元素是否一样然后合批会打断合批的操作
父物体 的 Pos 改变z轴 , 旋转改变 x y 轴,会退出批处理 会打断上下合批(UI和其他UI不在同一平面就不能合批)UI 网格重建流程
某ui改变----讲此UI设置脏标志---添加脏标志队列--下一帧重建mesh
页:
[1]