[Unity3D教程]Unity中如何编写对象重用池机制

[Unity3D教程]Unity中如何编写对象重用池机制

对象重用池的概念其实非常简单:创建使用后的对象不会直接销毁,而是存储在一个池子中,当需要时在可在池子中拿出再供使用。

对象池的最重要的特性,也就是对象池设计模式的本质是允许我们获取一个“新的”对象而不管它真的是一个新的对象还是循环使用的对象。

对象重用池是典型“空间换时间”案例。通过减少CPU调用系统调用时的资源消耗,转为对内存的长期占用,进而达到提升“处理速度”的效果。也就是说:对象重用池是对CUP的优化,而不是对内存的优化策略(反而是增加负担了呢)。

对象重用池机制在各个语言中都普遍存在,有些语言甚至将重用池机制封装到了框架底层,比如iOS中的TableViewCell的重用机制。在Unity中的用户自定义对象并没有现成类来提供重用管理,这个功能需要我们自己编写。

对象重用池的方案有非常多的成熟框架供我们使用,甚至三言两语就能勾勒出一幅重用池:


#使用堆栈模拟一个简单的对象重用池#

  

使用方法:


当然, 上述代码只能出现在演示Demo中, 它实在是太简单了。事实上,如果你搜索下用Unity实现的对象池类库,你会发现其中很多是相当复杂的。我们先来分析下一个合格的对象池应该具备哪些优秀品质:

• 对象进入对象池之时,应该提供接口事件,通知用户该事件。

• 从池子中拿出的对象时,应该提供接口事件,用户可以在方法内对该对象进行操作,比如重置、刷新数据。

• 能够管理多种对象。

• 能够提供清理池子的接口,甚至提供定期自动清理策略。

• 某些类型的资源是很珍贵的(如数据库连接),池需要显示上限并提供一个针对分配对象失败的安全措施;

• 对于需要长期持有的资源,如网络连接、数据库连接等资源,需要提供分配失败的安全措施。

• 线程安全的。

 

在此提供一种实现思路:

• 面向用户的ObjectPoolCtrl(对象池管理类)类:

该类直接与用户交互且负责管理多个对象池子.

• 能够进入池子的对象需要遵循的协议IReuse

• 能够进入池子的对象基类ReuseObject

• 池子类SubPool,真正妇科管理对象

 

 关系示意图:

 

接口代码:

public interface IReuse {
    void Spawn();
    void UnSpawn();
}

 

基类代:

using UnityEngine;
public abstract class ReuseObject : MonoBehaviourIReuse {
    // 所有类的基类想要入池子的象不要在MonoBehaviour
    // 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值