如果你在写Layabox对象池的时候不小心看到这篇文章,那么恭喜你,你写出来的对象池将会和Unity对象池一样方便灵活。
这篇文章将会把Egret、Layabox,如何通过类型获取类型名,如何通过对象获取类型名告诉大家。
一、Layabox
1、通过类型获取类型名并实例化一个对象,下面是我写的一个在对象池中根据类型名取出一个对象或实例化一个对象的方法。重点是ClassZ.name
/**
* 取出一个对象
* @param classZ Class
* @return Object
*
*/
public static pop(classZ: any, ...args: any[]): any {
let refKey = classZ.name;
if (!ObjectPool._content[refKey]) {
ObjectPool._content[refKey] = [];
}
var list: Array<any> = ObjectPool._content[refKey];
if (list.length) {
// 原来是pop,改成了shift,用队列方式来管理
return list.shift();
} else {
var argsLen: number = args.length;
var obj: any = new classZ(...args);
obj.ObjectPoolKey = refKey;
return obj;
}
}
2、通过对象获取类型名,下面是我的对象池中归还一个对象的写法。
/**
* 放入一个对象
* @param obj
*
*/
public static push(obj: any): boolean {
if (obj == null) {
return false;
}
if (obj["dispose"]) {
obj.dispose();
}
var refKey: any = obj["__proto__"].constructor.name;
//保证只有pop出来的对象可以放进来,或者是已经清除的无法放入
if (!ObjectPool._content[refKey]) {
return false;
}
ObjectPool._content[refKey].push(obj);
return true;
}
二、Egret
1、通过类型获取类型名并实例化一个对象。和layabox对比,这次重点变成了classZ.prototype[“class”]
/**
* 取出一个对象
* @param classZ Class
* @return Object
*
*/
public static pop(classZ: any, ...args: any[]): any {
let refKey = classZ.prototype["__class__"];
if (!ObjectPool._content[refKey]) {
ObjectPool._content[refKey] = [];
}
var list: Array<any> = ObjectPool._content[refKey];
if (list.length) {
// 原来是pop,改成了shift,用队列方式来管理
return list.shift();
} else {
var argsLen: number = args.length;
var obj: any = new classZ(...args);
obj.ObjectPoolKey = refKey;
return obj;
}
}
2、通过对象获取类型名
/**
* 放入一个对象
* @param obj
*
*/
public static push(obj: any): boolean {
if (obj == null) {
return false;
}
if (obj["dispose"]) {
obj.dispose();
}
var refKey: any = obj.ObjectPoolKey;
//保证只有pop出来的对象可以放进来,或者是已经清除的无法放入
if (!ObjectPool._content[refKey]) {
return false;
}
ObjectPool._content[refKey].push(obj);
return true;
}
使用起来肯定就很方便了:
var msgVo:MessageVo = ObjectPool.pop(MessageVo); // 从对象池取对象
ObjectPool.push(msgVo); // 将对象存入对象池