MVC框架探索(三)UI对象池

前言

最近这段时间比较忙,所以断更了两个星期。现在终于有时间坐下来继续总结MVC剩下的部分了。这个对象池就是我的demo的UI框架中最后一个大的模块了,当然,UI框架还有很多其他的东西可以讨论,不过我暂时还没有在demo框架中加入,等到后续慢慢扩展之后,再来继续补充吧。

对象池思想和介绍

对象池的思想其实不难理解,本质上是一种复用的思想。在同一个类型的物体或者其他东西,需要大量创建和销毁的时候,会对性能造成一定的负担,那么我们可以通过创建对象池的方式,在需要销毁时,把对象放入对象池,那么在下次创建时,也不需要重新创建,只需要从对象池中获取即可。而在游戏开发中,频繁创建和销毁Gameobject,会带来一定的消耗,所以使用对象池,对性能有一定的提升。

对象池具体创建和使用

现在,我们对于对象池有了一个基本的了解,那么就可以考虑,用什么样的方式来实现对象池。

对象池的创建

回顾一下刚刚我们讨论的内容,我们是在对同一种类型的物体大量创建销毁,才考虑使用对象池。其实在这个思路里,我们已经大致确定了我们需要用到的数据结构了,实际上就是一个声明了类型的列表。再小小的扩展一下,一个列表我们只能维护一种类型,如果我们需要维护多种类型,那我们就可以用字典了,key值是用于查找到对象类型的键,value则是该类型的对象池。并且为了方便存取,对象池我使用了Queue队列。

对象池的使用

创建

基于对象池的思想,当我们需要创建一个具体的对象时,我们可以优先从对象池中获取。当对象池中没有存放的对象时,我们则创建一个对应类型的对象放入对象池中。

有些时候,可能会有些东西创建和销毁不那么频繁,我们可能不需要用到对象池,但是创建对象的方法还是需要的,所以在写这个方法时,我们可以通过传参来确认我们的对象是否需要对象池。

这里有一个需要注意的点,虽然之前我们说,在创建时放入对象池,实际上这样做是不严谨的。因为我们并没有在创建对象池的时候在其中做预留的对象,那么当我们需要连续取出多个物体时,你会发现当第一个物体创建完成放入对象池并且拿出时,后续物体从对象池拿到的都是第一个物体。所以,我在创建时没有做放入对象池的操作,而是通过销毁时放入。

但是这里其实有可以优化的地方,因为如果我第一次就要大量创建的话,会导致创建非常频繁,所以还是可以通过预留的方式提前创建好,并且通过已知的最大显示个数来规定对象池的最大数量,这样,对象池就可以做到严谨的创建时从对象池获取,销毁时放入对象池的思想。

销毁

当我们需要销毁对象时,放回对象池即可

但是在这里还有一个需要注意的点,因为我们做的是UI的对象池,那么我们对象肯定都是场景中的GameObject,那么在销毁时,我们除了在逻辑层放入对象池外,还需要处理一下GameObject的显示问题。所以,我提前在场景中设置了一个UIPool的挂点,在销毁时把GameObject隐藏并且放入UIPool下即可。

补充

在实际的UI面板开发过程中,我们往往是在UI面板上除了panel本身的子类之外,还会掺杂着很多其他的prefab,在关闭面板时,肯定也需要关闭这些prefab。除了面板和prefab需要进入对象池管理外,还有一个值得注意的点,就是如何关闭或者销毁一个面板中所有用到的prefab。

其实处理很简单,在上面的代码中也有其中的部分。就是在面板中引用这些prefab时,把这些prefab放入一个列表中,让面板来管理即可。

提前声明好容器,然后以面板为key值,在使用预制体时把其放入对应的list管理,那么在销毁时也可以直接获取并且进行销毁或者放入自己的对象池。

总结

对象池的思想其实非常的简单,核心点就在于对对象的复用。但是使用的时候可以根据自己的需要以及场景做出非常多的调整,而这些对于游戏开发的性能来说,也是一个非常可观的提升。只要理解了它的思想,在实际开发过程中,多多尝试即可。

那么UI框架的部分暂时就要告一段落了,等到后续加入了某些新模块或者开发了其他方面的东西,再来补充我们的UI框架。

玩游戏,做游戏,努力成为一个更好的游戏人!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值