1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
| // 对象池
class ObjectPool<T> {
private pool: T[] = [];
private factory: () => T;
private reset: (obj: T) => void;
private maxSize: number;
constructor(
factory: () => T,
reset: (obj: T) => void,
initialSize: number = 10,
maxSize: number = 100
) {
this.factory = factory;
this.reset = reset;
this.maxSize = maxSize;
// 预创建对象
for (let i = 0; i < initialSize; i++) {
this.pool.push(factory());
}
}
acquire(): T {
if (this.pool.length > 0) {
return this.pool.pop()!;
}
return this.factory();
}
release(obj: T): void {
if (this.pool.length < this.maxSize) {
this.reset(obj);
this.pool.push(obj);
}
}
resize(size: number): void {
while (this.pool.length < size) {
this.pool.push(this.factory());
}
while (this.pool.length > size) {
this.pool.pop();
}
}
}
// 对象池管理器
class PoolManager {
private pools = new Map<string, ObjectPool<any>>();
register<T>(
name: string,
factory: () => T,
reset: (obj: T) => void,
config?: PoolConfig
): void {
this.pools.set(name, new ObjectPool(
factory,
reset,
config?.initialSize,
config?.maxSize
));
}
acquire<T>(name: string): T {
const pool = this.pools.get(name);
if (!pool) {
throw new Error(`Pool not found: ${name}`);
}
return pool.acquire();
}
release<T>(name: string, obj: T): void {
const pool = this.pools.get(name);
if (pool) {
pool.release(obj);
}
}
}
// 使用示例
// 初始化
const poolManager = new PoolManager();
poolManager.register('bullet',
() => new Bullet(),
(bullet) => bullet.reset(),
{ initialSize: 50, maxSize: 200 }
);
poolManager.register('enemy',
() => new Enemy(),
(enemy) => enemy.reset(),
{ initialSize: 20, maxSize: 100 }
);
// 游戏中
function spawnBullet(position: cc.Vec3) {
const bullet = poolManager.acquire<Bullet>('bullet');
bullet.activate(position);
}
function destroyBullet(bullet: Bullet) {
poolManager.release('bullet', bullet);
}
|