UI动静分离 | 定义:将会动的UI元素和静止不动的UI元素分离开来,让合并的范围缩小,只合并那些会动的UI元素,因为它们的重绘频率比较高 动静分离后,CPU在重绘和合并时的消耗就大大降低了 那么如何分离它们呢?UGUI系统的是Canvas,NGUI系统的是UIPanel |
拆分过重的UI | 如何拆分?把隐藏的UI拆分出来,使其成为独立运作的界面,只在需要显示时才调用实例化 |
UI预加载 | 在游戏开始前或在进入某个场景前预先加载一些UI,让实例化和初始化的消耗在游戏前平均分摊到等待的时间线上 大都使用AssetBundle来加载资源,也有部分使用Unity的本地打包机制(即使用Resources这个API接口)来加载资源 所有的预加载都会引出另一个问题,即CPU集中消耗会带来卡顿现象。预加载并没有消减CPU消耗,只是把这些消耗分离了或者提前了,拆分到了各个时间碎片里,让人感受不到一瞬间有很大的CPU消耗 |
UI字体拆分 | 如何拆分?把字体中的常用字拆分出来,另外生成一个字体文件,让字体文件变小,消耗内存变少 |
Scroll View(滚屏)优化 | 为什么要优化?大量元素在窗口中不停地滚动会导致合批和渲染裁剪,在生成和滑动UI元素时,会消耗大量的CPU来重构网格,进而导致画面缓慢、卡顿 将策略中所有元素都实例化问题改为只实例化需要显示的实例数量,重复利用 |
网格重构的优化 | UGUI系统的图元素在改变颜色或Alpha后会导致网格重 UGUI网格合并机制?将拥有相同材质球的网格合并在一起,才能达到最佳效果;一个材质球对应一个图集,只有相同图集内的图片才需要合并在一起 如何优化?使用自定义特殊材质球进行渲染改变颜色和Alpha,这样UGUI就不需要网格重构了 |
UI展示与关闭的优化 | 利用时间碎片进行预加载 在关键时隐藏节点而不是销毁(~……~虽然内存没有变化,但网格重构和组件激活会有大量的CPU消耗) 移除节点代替隐藏会更好(~……~移除屏幕后相机会对其进行裁剪判断,因此需要设置UI为不可见的层级Layout) |
对象池的运用 | 程序中有重复实例化并不断销毁的对象时 每个需要使用对象池的对象都需要继承对象池的基类对象,这样在初始化时可以针对不同的对象重载,区别对待不同类型的对象 销毁操作时使用对象池接口进行回收 场景结束时要及时销毁整个对象池 |
UI图集拼接的优化 | 充分利用图集空间 图集大小控制 图片的拼接归类 |