Быстрее сбросить коллекцию свойств или создать новый экземпляр?
У меня есть 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