2012-04-10 4 views
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 будет происходить тяжелая работа для каждого из тех свойств, которые я сброшу (математически).

ответ

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


EDIT:

Использование метода identity будет иметь преимущества обоих подходов (простота и производительность):

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

Ваша правка заслуживает бесконечных upvotes. – Marty

+0

Спасибо. Взгляните на это сообщение (http://jacksondunstan.com/articles/1417). Вы можете улучшить производительность намного больше, если вы используете «BitmapData.copyPixels()» вместо «BitmapData.draw()». – sch