vlambda博客
学习文章列表

UGUI研究院之缓存策略让UI打开更快(三十)


UGUI效率不高,界面稍微复杂一点就会出现打开慢的情况,至于为什么效率不高,Unity官网或者UWA的教程都已经写的很全面了。本篇文章我不站在效率优化的角度来讲(快成型的项目其实有很多无奈),从UI缓存的角度来讲,利用缓存UI的方式来让UI打开的速度更快。灵感来自我的上一篇文章

UGUI研究院之Prefab嵌套特效部分(二十九)

UI界面的量是很大的,例如一个MMO手游,prefab至少也得有400个以上。细心的你观察一下UI的效果图,你就会发现有很多UI元素大量的在重复出现。

比较常见的例如:

1.UI界面的底板,关闭按钮、标题、帮助按钮

2.带品质边框的图标、底图、icon、边框材质

3.按钮(可能也就是文字不一样或者大小不一样)

4.UI上显示3D模型

5.UI头像

仔细观察还会有很多这样类似的UI元素,我的缓存思路就是提前把UI元素做成模板,模板被嵌套在UI中,但是需要设置成只读,不能被使用者修改破坏原始模板的结构。

缓存池的写法就常见了,无非就是打开新界面如果出现模板元素从缓存池里取,池子里没有就创建,关闭界面再把它们放进缓存池子,这样循环的复用起来。(做到让使用者毫无感知就很方便了)

UGUI操作UI元素的4大不可抗拒的耗时,profiler里可以很清楚的看到这些耗时。

GameObject go = GameObject.Instantiate ();//耗时1go.transform.SetParent (); //耗时2go.SetActive (false);//耗时3go.SetActive (true);//耗时4

如果有缓存策略的话,关闭界面时把UI放在池子里,隐藏/显示只设置它的Layer,不要去 SetActive(false)  ,这时候耗时就只剩下SetParent了,打开界面的速度自然就会快很多了。

//GameObject go = GameObject.Instantiate ();//耗时1GameObject go = GetByCache()go.transform.SetParent (); //耗时2//go.SetActive (false);//耗时3//go.SetActive (true);//耗时4

UGUI有个特性,如果设置某个层不被显示,需要给Canvas设置,这样这个Canvas下面的所有UI都不会被显示在屏幕上了。例如下图所示,把需要缓存的UI元素放在CacheCanvas下,CachCanvas是一个不被UICamera看到的层。

UGUI研究院之缓存策略让UI打开更快(三十)


OK, 原理部分已经讲完,我再讲讲一些具体的实施经验。

1.必须方便预览

使用者把自己的UIPrefab文件拖入Hierarchy视图中需要立即将所有模板预览出来,OnPreView就是预览,当然这里预览出来的prefab不能被使用者apply后重新又保存在自己UIPrefab上。(如何设置prefab嵌套 只读不可被修改 请参考我的上一篇文章)http://www.xuanyusong.com/archives/4422

#if UNITY_EDITOR[CustomEditor(typeof(UISetting))]public class UISettingInspector : Editor{ void OnEnable() { if (!Application.isPlaying) {  if (target != null) { foreach (var item in (target as UISetting).GetComponentsInChildren<UICacheBase>()) { item.OnPreview ();//预览界面中所有的缓存元素 } } } }}#endif

2.加载缓存的策略

无非就是判断池子里有没有,没有创建一类的,SetParent 这里我就不太赘述。。

3.UI缓存的元素

可能需要给缓存UI元素绑定脚本,举个例子例如,缓存按钮,那么肯定需要提供按钮的点击事件回调。使用者可以在自己的界面类中调用里面的方法,或者监听事件。

再举个例子,比如我缓存了图标组件,但是又想加点小红点或类似的角标图,角标的图想保存在自己的prefab里,但是图标元素想用缓存的。这样运行时 setActive 父节点子节点的逻辑就一样了。

UGUI研究院之缓存策略让UI打开更快(三十)


还是上面的例子,我把UI元素保存在界面中,点击apply后,只有UIBox不属于这个UI界面。UIBOX和红点角标的层级可以单独调整。

UGUI研究院之缓存策略让UI打开更快(三十)

再给大家展示一个我们的成品UI Prefab 拖到Hierarchy后会自动展开cache部分,apply后不会被保存在UI上。嵌套的prefab也不能被使用者修改。

UGUI研究院之缓存策略让UI打开更快(三十)

UGUI研究院之缓存策略让UI打开更快(三十)


4.此法最爽的地方就是使用者几乎毫无感知缓存的存在。

每个模板都有一个路径,运行时的策略 就是  池子里有 就 setParent 到 界面模板父节点下。如果没有 就是读取prefab,实例化到hierarchy然后在setParent 到 界面模板父节点下 绑定一些代码的监听等等。

最后需要注意的是, 例如按钮这类元素,每次从池子中取出来需要添加监听,放回池子里也需要移除按钮的监听。然后就让我们的UI更快一点吧。嘿嘿,如果你有自己的意见或者想法欢迎在下面给我留言。

原文链接:https://www.xuanyusong.com/archives/4430



长按二维码

禾文先生



文章好看点这里