对象池

在系统设计中,经常会使用 的概念。比如数据库连接池,socket连接池,线程池,组件队列。 可以节省对象重复创建和初始化所耗费 的时间,可以简化对象获取和使用的过程。

的结构是通用的,就是不管他里面保存的是哪一种对象,他的工作方法都基本不变。无非是初始化一系列对象,然后提供一个获取可用对象,一个归还对象的接口。

当我们频繁创建删除大量对象的时候,对象的创建删除所造成的开销就不容小觑了。为了提高性能,我们往往需要实现一个对象池作为Cache: 使用对象时,它从池中提取。用完对象时,它放回池中 。从而减少创建对象的开销。

H5-erget

简单的对象池
  • 回收不用的对象
public recycleObject(noUse:any):void {  
    this._pool.push(noUse);  
} 
  • 需要用这个对象的时候,先检索对象池有没有缓存对象,有的话取出来以后初始化属性,对象池是空的话再创建新对象
public getObject():any {
    if(this._pool.length)
        return this._pool.shift();
    else
        return new egret.Bitmap(); //用bitmap作示例
}

需要创建对象的时候,调用getObject方法,不需要的对象实例通过recycleObject方法回收。

干货
  • 声明一个存放对象池数组 的数组
private static cacheDict:Object = {};
  • 创建对象,对象池有就拿出来初始化,没有就创建一个对象。(冒号后面是返回值,返回值的类型就是我们的缓存对象。)
public static produce(textureName:string):fighter.Airplane {
    // textureName 是缓存对象的标识,这样的写法的好处是可以缓存多种不同的对象,比如飞机有两种,“p1”,“p2”。
    // 如果textureName对应的对象池为空的话,初始化一个对象池。
    if(fighter.Airplane.cacheDict[textureName]==null){
        fighter.Airplane.cacheDict[textureName] = [];
    }
    //根据对象的标示textureName找到对象缓存池数组
    var dict:fighter.Airplane[] = fighter.Airplane.cacheDict[textureName];
    // 声明一个对象来接收需要返回出去的对象
    var theFighter:fighter.Airplane;
    // 如果对象池有对象就把对象拿出来用,否则创建一个对象

    if(dict.length>0) {
        theFighter = dict.pop();
    } else {
        theFighter = new fighter.Airplane(RES.getRes(textureName));
    }
    // 返回对象
    return theFighter;
}
  • 回收对象
public static reclaim(theFighter:fighter.Airplane,textureName:string):void {
    // 如果textureName对应的对象池为空的话,初始化一个对象池。
    if(fighter.Airplane.cacheDict[textureName]==null){
        fighter.Airplane.cacheDict[textureName] = [];
    }
    // 根据对象的标示textureName找到对象缓存池数组
    var dict:fighter.Airplane[] = fighter.Airplane.cacheDict[textureName];
    // 如果对象池里面没有这个对象,那么缓存进对象池
    if(dict.indexOf(theFighter)==-1){
        dict.push(theFighter);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值