19 способов повысить производительность actionscript 3.0 приложений

alt

 

Здесь представлены некоторые приемы, которые помогут повысить производительность наших приложений:

1) Создавайте константы для часто используемых объектов типа new Point(0,0) или new Rectangle(0,0,320,240):

//вызов 100000 раз: 75мс<br />new Point(0,0);<br />//или<br />private static const POINT:Point = new Point(0,0);<br />//8мс<br />POINT;

Быстрее на 838%

2) Сократите указания на статические члены классов. Вместо этого старайтесь использовать переменные пакета:

//15мс
SomeClass.somevar;
package somepackage{
public const somevar:int;
}
//8мс
somevar;

на 66% быстрее

3) Сохраняйте getter свойства в локальных переменных при их использовании более одного раза.

somesprite.graphics.clear();<br />somesprite.graphics.beginFill(0x000000);<br />somesprite.graphics.drawRect(0,0,10,10);<br />somesprite.graphics.endFill();<br /><br />// лучше заменить на<br /><br />var n:Graphics = somesprite.graphics;<br />n.clear();<br />n.beginFill(0x000000);<br />n.drawRect(0,0,10,10);<br />n.endFill();

4) Создавайте собственные reflection-методы вместо использования getDefinitionByName(getQualifiedClassName(object))

utils reflection
// 503мс
var someclass:Class = getDefinitionByName(getQualifiedClassName(someObject));
// getter reflection
public class SomeClass {
public function get reflect():Class {
return SomeClass;
}
}
// 9мс
var someclass:Class = object.reflect();

быстрее на 5489%

5) Страрайтесь использовать строгое типизирование

6) Приводите к нужным типам, например, при чтении из массива.
Быстрее будет обращаться к image

var image: BitmapData = images<ol>
</ol>
;<br />image.getPixel(x,y)<br />//чем к<br />images<ol>
</ol>
.getPixel(x,y);

7) Где возможно, используйте int вместо Number

8) Операторы побитового сдвига работают быстрее:

Побитовый сдвиг влево быстрее на 300% при умножении на любую степень двойки:

x = x * 2;<br />x = x * 64;<br />//равно:<br />x = x &lt;&lt; 1;<br />x = x &lt;&lt; 6;

Побитовый сдвиг вправо быстрее на 350% при делении на любую степень двойки:

x = x / 2;<br />x = x / 64;<br />//равно:<br />x = x &gt;&gt; 1;<br />x = x &gt;&gt; 6;

Извлечение компонентов цвета:

//24bit<br />var color:uint = 0x336699;<br />var r:uint = color &gt;&gt; 16;<br />var g:uint = color &gt;&gt; 8 &amp; 0xFF;<br />var b:uint = color &amp; 0xFF;<br />//32bit<br />var color:uint = 0xff336699;<br />var a:uint = color &gt;&gt;&gt; 24;<br />var r:uint = color &gt;&gt;&gt; 16 &amp; 0xFF;<br />var g:uint = color &gt;&gt;&gt;  8 &amp; 0xFF;<br />var b:uint = color &amp; 0xFF;

Объединение компонентов цвета:

//24bit<br />var r:uint = 0x33;<br />var g:uint = 0x66;<br />var b:uint = 0x99;<br />var color:uint = r &lt;&lt; 16 | g &lt;&lt; 8 | b;<br /><br />//32bit<br />var a:uint = 0xff;<br />var r:uint = 0x33;<br />var g:uint = 0x66;<br />var b:uint = 0x99;<br />var color:uint = a &lt;&lt; 24 | r &lt;&lt; 16 | g &lt;&lt; 8 | b;

9) Обмен значениями численных переменных без использования временной переменной:

var t:int = a;<br />a = b;<br />b = t;<br />//равно:<br />a ^= b;<br />b ^= a;<br />a ^= b;

Быстрее на 20%.

10) Инкремент/декремент.
Внимание: это пример понижения производительности, но зато есть возможность понизить читабельность кода для врагов:)

i = -~i; // i++<br />i = ~-i; // i--

11) Смена знака с помощью NOT или XOR (говорят на 300% быстрее):

i = -i;<br />//равно:<br />i = ~i + 1;<br />//или<br />i = (i ^ -1) + 1;

12) Подсчет остатка

Если делитель является степенью двух, то остаток можно подсчитать быстрее на 600% следующим образом:
остаток = делимое & (делитель - 1);

x = 131 % 4;<br />//равно:<br />x = 131 &amp; (4 - 1);

13) Проверка на четность/нечетность:

isEven = (i % 2) == 0;<br />//равно:<br />isEven = (i &amp; 1) == 0;

Быстрее на 600%.

14) Абсолютное значение. Версия 1 быстрее на 250%, чем Math.abs(), а версия 2 быстрее на 20%, чем версия 1.

//версия 1<br />i = x &lt; 0 ? -x : x;<br />//версия 2<br />i = (x ^ (x &gt;&gt; 31)) - (x &gt;&gt; 31);

15) Сравнение двух числе на равенство знаков

eqSign = a * b &gt; 0;<br />//равно:<br />eqSign = a ^ b &gt;= 0;

На 35% быстрее.

16) Быстрое конвертирование цвета из R5G5B5 в R8G8B8

R8 = (R5 << 3) | (R5 >> 2)
G8 = (R5 << 3) | (R5 >> 2)
B8 = (R5 << 3) | (R5 >> 2)

17) a++ быстрее, чем a = a + 1 и т.п.

18) Умножение быстрее деления.

Лучше использовать a = b*.5 вместо a = b / 2

19) int(1.5) быстрее, чем Math.floor(1.5)
Аналогично int(1.5) + 1 быстрее, чем Math.ceil(1.5)

Комментарии

Аватар пользователя Allidjan

Нужный урок

good

спасибо!

Аватар пользователя moisha

Прикольно жаль ток что нет обьяснения к операторам. Некоторые я знаю, а некоторые в первый раз вижу.

dontknow