UGUI研究院之缓存策略让UI打开更快(三十)
Posted 禾文先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ();//耗时1
go.transform.SetParent (); //耗时2
go.SetActive (false);//耗时3
go.SetActive (true);//耗时4
如果有缓存策略的话,关闭界面时把UI放在池子里,隐藏/显示只设置它的Layer,不要去 SetActive(false) ,这时候耗时就只剩下SetParent了,打开界面的速度自然就会快很多了。
//GameObject go = GameObject.Instantiate ();//耗时1
GameObject go = GetByCache()
go.transform.SetParent (); //耗时2
//go.SetActive (false);//耗时3
//go.SetActive (true);//耗时4
UGUI有个特性,如果设置某个层不被显示,需要给Canvas设置,这样这个Canvas下面的所有UI都不会被显示在屏幕上了。例如下图所示,把需要缓存的UI元素放在CacheCanvas下,CachCanvas是一个不被UICamera看到的层。
OK, 原理部分已经讲完,我再讲讲一些具体的实施经验。
1.必须方便预览
使用者把自己的UIPrefab文件拖入Hierarchy视图中需要立即将所有模板预览出来,OnPreView就是预览,当然这里预览出来的prefab不能被使用者apply后重新又保存在自己UIPrefab上。(如何设置prefab嵌套 只读不可被修改 请参考我的上一篇文章)http://www.xuanyusong.com/archives/4422
[ ]
public class UISettingInspector : Editor
{
void OnEnable()
{
if (!Application.isPlaying) {
if (target != null) {
foreach (var item in (target as UISetting).GetComponentsInChildren<UICacheBase>()) {
item.OnPreview ();//预览界面中所有的缓存元素
}
}
}
}
}
2.加载缓存的策略
无非就是判断池子里有没有,没有创建一类的,SetParent 这里我就不太赘述。。
3.UI缓存的元素
可能需要给缓存UI元素绑定脚本,举个例子例如,缓存按钮,那么肯定需要提供按钮的点击事件回调。使用者可以在自己的界面类中调用里面的方法,或者监听事件。
再举个例子,比如我缓存了图标组件,但是又想加点小红点或类似的角标图,角标的图想保存在自己的prefab里,但是图标元素想用缓存的。这样运行时 setActive 父节点子节点的逻辑就一样了。
还是上面的例子,我把UI元素保存在界面中,点击apply后,只有UIBox不属于这个UI界面。UIBOX和红点角标的层级可以单独调整。
再给大家展示一个我们的成品UI Prefab 拖到Hierarchy后会自动展开cache部分,apply后不会被保存在UI上。嵌套的prefab也不能被使用者修改。
4.此法最爽的地方就是使用者几乎毫无感知缓存的存在。
每个模板都有一个路径,运行时的策略 就是 池子里有 就 setParent 到 界面模板父节点下。如果没有 就是读取prefab,实例化到hierarchy然后在setParent 到 界面模板父节点下 绑定一些代码的监听等等。
最后需要注意的是, 例如按钮这类元素,每次从池子中取出来需要添加监听,放回池子里也需要移除按钮的监听。然后就让我们的UI更快一点吧。嘿嘿,如果你有自己的意见或者想法欢迎在下面给我留言。
原文链接:https://www.xuanyusong.com/archives/4430
长按二维码
禾文先生
文章好看点这里
以上是关于UGUI研究院之缓存策略让UI打开更快(三十)的主要内容,如果未能解决你的问题,请参考以下文章