重置属性集合或创建新实例会更快吗?

Mar*_*rty 3 actionscript-3 recycle

我有一个Matrix我回收并用于将DisplayObject实例绘制到一个Bitmap.

目前,我重新设置Matrix每个项目之前,如下所示:

_matrix.a = 1;
_matrix.b = 0;
_matrix.c = 0;
_matrix.d = 1;
_matrix.tx = 0;
_matrix.ty = 0;
Run Code Online (Sandbox Code Playgroud)

做上述事情或仅仅这样做会更好吗?:

_matrix = new Matrix();
Run Code Online (Sandbox Code Playgroud)

一般来说,我会说前者,但是我不确定是否在Matrix我重置(数学)的每个属性中都有一些重要的东西.

sch*_*sch 7

我认为重复使用相同的实例Matrix比每次创建一个新实例更有效.

事实上,创建一个新实例是一个相对繁重的操作,这就是使用缓存的原因:创建一些实例并重用它们而不是创建大量实例.

我运行了一些基准测试,它确认了我的答案:

var t:Number;
var i:int;
var N:int = 10000000;

t = getTimer();
for (i = 0; i < N; i++) {
    _matrix = new Matrix();
}
trace(getTimer()-t); // 7600


t = getTimer();
for (i = 0; i < N; i++) {
    _matrix.a = 1;
    _matrix.b = 0;
    _matrix.c = 0;
    _matrix.d = 1;
    _matrix.tx = 0;
    _matrix.ty = 0;
}
trace(getTimer()-t); // 4162
Run Code Online (Sandbox Code Playgroud)

最后,请注意差异并不是那么大,并且只创建10000000新实例7600 ms,因此除非您每帧创建数千个矩阵,否则这两种方法都不会对性能产生明显影响.


编辑:

使用该方法identity将具有两种方法(简单性和性能)的优点:

t = getTimer();
for (i = 0; i < N; i++) {
    _matrix.identity();
}
trace(getTimer()-t); // 4140
Run Code Online (Sandbox Code Playgroud)