Обозреватель

Observer

среда, 14 мая 2008 г.

Повышение производительности AS3 приложений //Очень полезные советы

Оригинал. Flex 2 & Co

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

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

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


Быстрее на 838%

2) Сократите указания на статические члены классов. Вместо этого старайтесь использовать переменные пакета:
//15мс
SomeClass.somevar;
package somepackage{
public const somevar:int;
}
//8мс
somevar;

на 66% быстрее

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

somesprite.graphics.clear();
somesprite.graphics.beginFill(0x000000);
somesprite.graphics.drawRect(0,0,10,10);
somesprite.graphics.endFill();

// лучше заменить на

var n:Graphics = somesprite.graphics;
n.clear();
n.beginFill(0x000000);
n.drawRect(0,0,10,10);
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[index];
image.getPixel(x,y)
//чем к
images[index].getPixel(x,y);


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

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

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

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


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

x = x / 2;
x = x / 64;
//равно:
x = x >> 1;
x = x >> 6;


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

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


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

//24bit
//24bit
var r:uint = 0x33;
var g:uint = 0x66;
var b:uint = 0x99;
var color:uint = r << 16 | g << 8 | b;

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


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

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


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

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

i = -~i; // i++
i = ~-i; // i--


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

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


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

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

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


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

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


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

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

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


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

eqSign = a * b > 0;
//равно:
eqSign = a ^ b >= 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)


четверг, 3 апреля 2008 г.

Презентации с Флэш-потрошителя

Ниже приводятся две презентации, позаимствованные с Флэш Потрошителя.

Эльдар Прилуцкий: Событийная модель AS3.0, доклад c UAFPUG-1
Ростислав Сирык: PureMVC в картинках, доклад c UAFPUG-1

Модифицировать сообщения, посланные в блог через функцию SlideShare "Embed" не представляется возможным, поэтому, из соображений полит-корректности постю это сообщение.

PureMVC в картинках - часть 1

Событийная модель Action Script 3.0 //www.flash-ripper.com

вторник, 25 марта 2008 г.

Что мы знаем о 3D-движках во Flash? //Обзор 3D Flash-технологий

Оригинал. Флэш Потрошитель

Трехмерные миры во флэше растут не по годам, а по часам. Что у нас есть сегодня?

Papervision3D
Отец большинства современных трехмерных движков для Flash. Довольно быстро развивается, имеет экспериментальные ветви разработки. Куча демок (по первой ссылке). Open Source.

Away3D
Полностью самостоятельный движок, хотя изначально базировался на коде Papervision3D, но по ходу проекта был переписан практически заново. Создан Александром Задорожным из Киева (код, насколько я знаю, редактировался в FAR'е). Содержит массу уникальных возможностей, в т. ч. для текстурирования, освещения и придания рельефа поверхностям. Признан настолько хорошим, что авторы самого Papervision3D решили включить наработки Away3D в свой основной проект. К работе над Away3D уже подключилось несколько талантливых разработчиков. Open Source.

Sandy
Известен тем, что в использовании еще проще, чем Papervision3D (не базируясь на нем ни в коей мере), хотя и не имеет такой популярности. В общем, я не очень много знаю про Sandy, но демки у него тоже красивые. Open Source.

FFilmation AS3 Flash Isometric EngineМногообещающий изометрический движок (на русском),
показывающий очень неплохую производительность. Open Source.

Игровая платформа Alternativa Platform
Платформа для трехмерных игр, разрабатываемая Группой Товарищей из Перми. За флэш отвечает Антон Волков. Движок впечатляет уникальными возможностями и перфекционистской проработкой всего на свете, имеет продуманную схему интеграции с сервером.

ZenBullets Flash Isometric 3D Game Engine
Про этот движок я знаю еще меньше, позиционируется как изометрическая игровая платформа, но демки пока весьма скромные.

SWFZ
... кажись, единственный честный рейтрейсер (отрисовка по-пиксельно)