如果你在寫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); // 將對象存入對象池