美文网首页
对象池模块

对象池模块

作者: Qkuang | 来源:发表于2020-01-16 11:24 被阅读0次

IFramework所有模块总目录

简介

对象池:就是一个集合(使用哪种数据结构自己看着办)。当我们需要一个“物体实例”时,看对象池中是否有,如果有,就直接使用,不用重新创建。如果没有就 new一个,当新new的对象不使用时,就加入到池中(集合)。往复循环,达到一个对象,反复使用的目的。—— 单集合对象池。
在IF框架中,有多种“对象池”。我们使用的话只需要 实现指定的接口即可,不用再自己

简单使用

代码如下:

using UnityEngine;
using IFramework;

public class Enemy
{
    public string name;
    public Enemy(string name){
        Debug.Log("创建:"+name);
        this.name = name;
    }
    ~Enemy(){
        Debug.Log("销毁"+name);
    }
}
// 继承 对象池,并重写抽象成员
public class TimeTaskPool : ObjectPool<Enemy>
{
    protected override Enemy CreatNew(IEventArgs arg, params object[] param)
    {
        return new Enemy(param[0].ToString());
    }
}
public class TestPool : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        TimeTaskPool pool = new TimeTaskPool();
        Enemy enemy1 = pool.Get(null, "快刀手——敌人");
        Enemy enemy2 = pool.Get(null, "突击者——敌人");
        print(enemy1.name);
        print(enemy2.name);
        pool.Set(enemy1);
        Enemy enemy3 = pool.Get();
        print(enemy3.name);
    }
}

运行结果:


image.png

说明:

  • 只需要将自定义的类(对象池)继承自“ObjectPool<T>”即可。 并重写 抽象成员:CreatNew()即可。
  • 这里创建两个敌人对象。重点在于enemy3。再获得enemy3 之前,先把enemy1 放回池中,所以 enemy3 实际获得的对象 是 enemy1.
  • 最后Start()结束。

高级使用

代码如下:

using UnityEngine;
using IFramework;

// 要求要存放的物体必须实现:IPoolObject接口
public class Enemy : IPoolObject
{
    public string name;
    public Enemy(string name)
    {
        Debug.Log("创建(构造函数):" + name);
        this.name = name;
    }
    ~Enemy()
    {
        Debug.Log("销毁" + name);
    }

    public void OnClear(IEventArgs arg, params object[] param)
    {
        Debug.Log("清理" + name);
    }

    public void OnCreate(IEventArgs arg, params object[] param)
    {
        Debug.Log("创建" + name);

    }

    public void OnGet(IEventArgs arg, params object[] param)
    {
        Debug.Log("获取" + name);

    }

    public void OnSet(IEventArgs arg, params object[] param)
    {
        Debug.Log("存入" + name);

        
    }
}

public class TestPool : MonoBehaviour, IPoolObjectOwner
{
    // Start is called before the first frame update
    void Start()
    {
        //设置一下池子的最大容量
        var pool = PoolManager.GetPool<Enemy>();
        pool.SleepCapcity = 2;
        pool.AutoClear = true;
        //设置一下池子的CreateNew方法
        PoolManager.AddCreaterDel<Enemy>((type, arg, para) =>
        {
            Enemy gg = new Enemy(para[0].ToString());
            return gg;
        });
        
        Enemy enemy1 = pool.Get(null, "快刀手——敌人") as Enemy;
        Enemy enemy2 = pool.Get(null, "突击者——敌人") as Enemy;
        print(enemy1.name);
        print(enemy2.name);
        pool.Set(enemy1);
        Enemy enemy3 = pool.Get() as Enemy;
        print(enemy3.name);
    }
}

运行结果:


image.png

结尾

以上内容是 作者个人的理解,如有错误,欢迎指出。
顺便给出OnClick大佬自己 写的文档地址:007 对象池
如果对 IF框架有其他看法,也欢迎大家 进群交流。

相关文章

  • 对象池模块

    IFramework所有模块总目录 简介 对象池:就是一个集合(使用哪种数据结构自己看着办)。当我们需要一个“物体...

  • Unity-对象池模块

    为什么使用对象池 当一个游戏需要频繁的创建和销毁对象时,为了不增加GC的性能消耗,可以考虑使用回收对象来打到复用的...

  • ET 功能模块划分

    双端模块 组件系统 对象池 事件系统 Nlog 异步回调 ETTask/ETVoid MongoBson库 Tim...

  • asyncio实现代理池

    从一个代理池讲起? 搞爬虫的一般都有自己的代理池,代理池的结构一般分为抓取模块,存储模块,检测模块,api模块。抓...

  • Python 数据库连接池的正确打开方式

    在单独模块中定义数据库连接池对象: 在主程序中导入该模块: 问题来了:当我们在程序里导入另一个模块或者导入另一个模...

  • Unity 类对象池资源池对象池

    类对象池 包含创建对象池,取对象池中的内容,回收。 对象管理类 因为使用加载AB包的时候可能会频繁创建类,但是ne...

  • Laya_2D示例项目使用对象池预制体的创建、位置设置和添加到父

    //使用对象池创建盒子 1.对象池的使用 对象池创建箱子 let box = Laya.Pool.getI...

  • python 异步IO

    线程池的使用+requests模块+回调函数 进程池的使用+requests模块+回调函数 asyncio + a...

  • Unity--简单的对象池

    简单的对象池分三步走: 建立对象池 拿到对象 回收对象 Test为对象池,Obj为自动回收的物体 Test.cs ...

  • 对象池

    一、对象池概述: 对于那些实例化开销比较大,并且生命周期比较短的对象,我们可以通过池就行管理。所谓池,就相当于一个...

网友评论

      本文标题:对象池模块

      本文链接:https://www.haomeiwen.com/subject/etffzctx.html