as3对象池使用

前言

在编写代码时,经常要注意的一件事情是代码的优化,一般在代码中,实例化对象是相对来说比较耗时、消耗性能的操作了,优化该操作的常用方法之一是使用对象池技术,本次以ActionScript3为例,分析一波对象池技术的使用。

new对象耗时分析

对基本的MovieClip进行实例化10000次所耗时间如下所示:

实例化对象图

经过多次测试,该操作耗时约为40~50ms,这个时间感觉还可以接受的样子,下面再进行10000次加法与乘法操作来进行对比一下。

加法乘法操作图

经过多次测试,该操作耗时约为2~3ms,大约为new MovieClip操作的1/20 ~ 1/15,这里需要注意的是new的是一个普通的MovieClip,因此没有涉及到过多的其它操作,在实际开发中,一般是new自己写好封装的类,在new的过程中会做一些初始化操作,因此会更加耗时。

对象池类的编写

主要是把实例化好的对象存入池中,在需要使用的时候直接从池中取出对象,不再去new新的对象。对象用完之后再将其放入池中,以便下一次的使用。代码如下所示:

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
package Demo
{
import flash.display.MovieClip;
import flash.display.Sprite;

public class TestPool extends Sprite {
private static var objs:Array;
private static var count:int;
private static var size:int;

// 初始化池大小
public static function initPool(maxSize:int):void {
size = maxSize;
count = maxSize;
objs = [];
for (var i:int = 0; i < maxSize; i ++) {
objs.push(new MovieClip());
}
}

// 从池中取一个对象
public static function getObject():MovieClip {
if (count > 0) {
count --;
return objs[count];
}

// 当池中没有对象时,往池中创建size大小的对象
for (var i:int = 0; i < size; i ++) {
objs.unshift(new MovieClip());
}
count = size;

return getObject();
}

// 对象用完之后,继续放入池中,以便下次使用
public static function dispose(mc:MovieClip):void {
objs[count] = mc;
count ++;
}
}

}

对象池耗时测试

从池中取对象好像如下所示:

对象池耗时测试图

可以看出,对于10000次操作,初始化池所耗时间约为40~50ms,之后从池中取10000个对象所需时间约为4~6ms,提高了约10倍左右。

再对100000次操作进行测试如下:

对象池耗时测试图

可以看出,初始化池所耗时间约为550~600ms,而取操作只用了约30ms,可见对象池对于性能得提升还是非常有帮助的。在需要实例化多个相同对象的时候,尽量使用对象池技术来提高性能。


-------------本文结束感谢您的阅读-------------