Быстрее сбросить коллекцию свойств или создать новый экземпляр?

У меня есть 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 для каждого из этих свойств, которые я сбрасываю (математически), происходит что-то тяжелое.

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
Другие вопросы по тегам