as3对象池

在as3游戏开发中,内存问题基本是开发者最为头疼的了,官方也没具体的内存优化指导,开发者只能自己摸索着。显示列表的层级removechild、事件监听的及时移除或者弱引用。这些都是对于内存问题要注意的,因为AS3的垃圾回收机制并不是那么‘勤劳’的,垃圾回收只会在特定的时刻,或者是内存达到一定的瓶颈时才会进行。所以开发者要特别注意开发细节上的处理来节省内存。对象池是一个很好的方法。

 

比如在制作子弹射击的时候,子弹每次都被new出来。这样肯定很消耗内存。如果子弹new出来后屏幕上不需要这颗子弹了。可以将其放入对象池中。再次new的时候可以重复利用。

 

我写了一个对象池的类。这个类是单例的。用的是dictionary集合来进行的存储对象。KEY就是对象的包名+类名,所对应的是一个array数组。里面存放着可重复利用的对象

 

用 一个push方法来放入对象

用一个 pop方法来取出需要的对象。

 

package  {
import flash.utils.Dictionary;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
 
 
/**
* 用于显示对象的对象池类
* @author yanghongbin
*
*/
public class DisplayObjectPool {
private static var instance:DisplayObjectPool;
/**
*  作为对象池的词典dict
*/
private var objPoolDict:Dictionary = new Dictionary();
 
public function DisplayObjectPool() {
}
 
public static function getInstance():DisplayObjectPool {
if (instance == null) {
instance = new DisplayObjectPool();
}
return instance;
}
 
/**
* 向对象池中放入对象,以便重复利用
* @param disObj 要的放入对象
*
*/
public function push(oldObj:Object):void {
var objName:String = getQualifiedClassName(oldObj);
 
if (oldObj == null) {
return ;
}
 
if (this.objPoolDict[objName] == null) {
this.objPoolDict[objName] = [];
}
this.objPoolDict[objName].push(oldObj);
}
 
/**
* 从对象池中取出需要的对象
* @param targetObj 需要的对象类类名,没必要必须是类实例名 类名就可以
* @return 取出的相应对象
*
*/
public function pop(targetObj:Object):Object {
var objName:String = getQualifiedClassName(targetObj);
trace(objName);
 
if (this.objPoolDict[objName] != null && this.objPoolDict[objName].length > 0) {
return this.objPoolDict[objName].pop()as Object;
}
var objClass:Class = getDefinitionByName(objName)as Class;
var obj:Object = new objClass as Object;
return obj;
}
}
}


 

 

其实在push进去的可以做一步操作 就是将显示对象里的动态信息清空,比如有一个文本框,不清空文本框显示对象,而清空文本框的内容。这样取出的时候直接设置内容就行了,不用重新addchild 这样节省了很多计算量。以为添加一个对象到显示列表是很耗费时间的。相比其他常用代码操作而言。

这需要一个接口来约束下要用到对象池的有动态内容的显示对象。

如果是静态(画面中不动)的显示对象。比如子弹,气球,这样的,就不必了。。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值