3

私は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ますが、(数学的に)リセットした各プロパティで重いことが起こっているかどうかはわかりません。

4

1 に答える 1

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

最後に、違いはそれほど大きくなく、10000000新しいインスタンスの作成にかかる時間はわずか7600 msであるため、フレームごとに数千のマトリックスを作成しない限り、どちらのアプローチもパフォーマンスに顕著な影響を与えないことに注意してください。


編集:

この方法identityを使用すると、両方のアプローチの利点 (単純さとパフォーマンス) が得られます。

t = getTimer();
for (i = 0; i < N; i++) {
    _matrix.identity();
}
trace(getTimer()-t); // 4140
于 2012-04-10T08:53:40.733 に答える