【问题标题】:Is it faster to reset a collection of properties or create a new instance?重置属性集合或创建新实例是否更快?
【发布时间】:2012-04-22 12:51:41
【问题描述】:

我有一个Matrix,我将其回收并用于将DisplayObject 实例绘制到Bitmap 上。

目前,我在渲染每个项目之前重置了Matrix,如下所示:

_matrix.a = 1;
_matrix.b = 0;
_matrix.c = 0;
_matrix.d = 1;
_matrix.tx = 0;
_matrix.ty = 0;

是做上面的更好,还是干脆做这个更好?:

_matrix = new Matrix();

通常我会说前者,但我不确定在 Matrix 的情况下,我重置的每个属性是否都会发生一些沉重的事情(数学上)。

【问题讨论】:

    标签: actionscript-3 recycle


    【解决方案1】:

    我认为重复使用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
    

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


    编辑:

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

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

    【讨论】:

    • 谢谢。看看这个post。如果您使用BitmapData.copyPixels() 而不是BitmapData.draw(),您可以进一步提高性能。
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多