Где, как и зачем использовать inline в as3?

Share Button

Один приятель с форума попросил накидать статью про инлайн. Конечно, их и без того очень много. Но для освежения своей и Вашей памяти все же напишем очередную.

В статье по рекомендациям по работе с мобильными устройствами и Adobe Air я вскользь писал про «много маленьких методов». Давайте проведем сравнительный анализ.

speed

И так. Inline — это встраивание тела метода в точку его вызова. Ускорение достигается за счет того, что исчезают затраты на доступ к классу и поиск в нем нужного метода на лету. Компилятор на этапе построения программы вырезает тело метода и встраивает каждый раз заново его туда, где к нему было обращение. Из этих слов становится видно, что это влияет и на размер итогового файла. Но не страшно — главное, что не портит производительность.

Я знаю инлайн во Flash двух видов — ручной и автоматический. Для начала рассмотрим старый, добрый ручной метод. Но сначала мы сделаем базовый код, который вообще не будет использовать инлайн и будет он у нас в качестве шаблона:

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getTimer;

	public class inlinetutorial extends Sprite
	{
		public function inlinetutorial()
		{
			var tf : TextField = new TextField();
			addChild(tf);

			var timer : int = getTimer();
			for ( var i : int = 0; i < 5000000; i ++ ) {
				var res : Number = formula1(80,22,22,77);
			}		
			tf.text = String(getTimer() - timer + " ms");
		}

		private function formula1(x1:Number,x2:Number,y1:Number,y2:Number):Number{
			var dx : Number = x2 - x1;
			var dy : Number = y2 - y1;
			return dx*dx + dy*dy;
		}
	}
}

После запуска кода мы получаем время выполнения цикла — 30ms.

Настает время провернуть первый шаг оптимизации — ручной inline.

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getTimer;

	public class inlinetutorial extends Sprite
	{
		public function inlinetutorial()
		{
			var tf : TextField = new TextField();
			addChild(tf);

			var timer : int = getTimer();
			for ( var i : int = 0; i < 5000000; i ++ ) {
				var dx : Number = 22 - 80;
				var dy : Number = 77 - 22;
				var res : Number = dx*dx + dy*dy;
			}		
			tf.text = String(getTimer() - timer + " ms");
		}

	}
}

Результат уже лучше — 10 ms на выполнения цикла.

С чем это связано? Всё просто! Flash плеер уже не нуждается в обращении в класс и происходит мгновенная обработка математики. Мы экономим время процессору, а он награждает нас не плохом результатом!

Настало время поговорить об автоматическом инлайне. Данный способ будет работать только с новой версией компилятора ASC2.0 (не путайте с ActionScrasc2ipt 2.0). Любителям писать код во Flash Professional придется использовать ручной инлайн, т.к. Flash Professional использует свой, независимый компилятор. Не смотря на то, что я веду дебаты на тему внедрения внешнего компилятора, как это делает Flash Builder, пока ответ был дан один — «Используйте для кода те средства разработки, которые используются не для анимации.». В целом-то оно и правильно.

И так, новый компилятор. Он появился достаточно давно — конец лета 2012 года. Air 3.4 / Fp. 11.4. Про все его плюсы я рассказывать не буду — тема об инлайне.

Чтоб включить инлайн, нам надо к опциям компилятора приписать -inline строку. А код, который мы будем «инлайнить» — пометим мета-тэгом [Inline]. Но для его работы не стоит забывать, что метод должен быть static, final или global. Об этом в ссылке выше на анонс компилятора.

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getTimer;

	public class inlinetutorial extends Sprite
	{
		public function inlinetutorial()
		{
			var tf : TextField = new TextField();
			addChild(tf);

			var timer : int = getTimer();
			for ( var i : int = 0; i < 5000000; i ++ ) {
				var res : Number = formula1(80,22,22,77);
			}		
			tf.text = String(getTimer() - timer + " ms");
		}

		[Inline]
		public static function formula1(x1:Number,x2:Number,y1:Number,y2:Number):Number{
			var dx : Number = x2 - x1;
			var dy : Number = y2 - y1;
			return dx*dx + dy*dy;
		}
	}
}

В итоге у нас все тот же старый «читаемый» код. А вот интерпретируется он в такой, которым его мы делали в ручном режиме — не красивым и раздутым.

Скорость выполнения цикла с [Inline] так же составила 10 ms, как и в ручном варианте.

Сравнительная таблица результатов без инлайна, с ручным и автоматическим на уровне компиляторе. Чем выше значение, тем хуже.

inline_demo

Вывод такой, что победителем будет код с инлайном. Без разницы с каким — ручным или автоматическим на этапе компиляции. На выходе байт код одинаковый. Конечно, можно сказать, что при 5000000 итерациях это существенно, а вот при 2000 нет — я не соглашусь.

Самый быстрый 2D физический движок Nape для Flash на половину состоит из инлайн-методов и стоит их отключить, как производительность падает от 30 до 50%. Будет разница даже на 20 кубиках, если отключить встраивание. По-этому, друзья, кто пишет флеш приложения под старый плеер — napeзанимайтесь ручным встраиванием везде, где это только можно. Кто работает под более новый флеш плеер (11.4 и выше) — не пренебрегайте инлайном. Он фантастически способен ускорить проект в целом. Много мелких методов в сумме выдадут очень приятный бонус в виде довольных игроков, у которых будет меньше тормозить.

По просьбе читателей делаю акцент на то, что для многих портальных флеш игр разработчики ограничиваются старыми версиями флеш плеера. В этом случае используйте ручной инлайн. Когда собираете swf новым компилятором — [Inline] будет работать и в старых версиях swf, т.к. это лишь тэг для компилятора, а не swf файла. По-этому, собирая с [Inline] — не переживайте. Флешка будет и под 10.0 работать, если использовались API от 10.0.

Для проверки работает флеш или нет — можете скачивать любой старый флеш плеер из архива http://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html

Всем здоровья и улыбок. И не забывайте — у команды Adobe Flash Runtime и Adobe Air на 2014 год больше планы по развитию нашего любимого средства разработки.

fdМоя статья описывает работу Inline во Flash Builder 4.7. Для тех же, кто работает во Flash Develop — рекомендую посетить статью [FlashDevelop] Настройка работы через ASC2.0. В ней Вы найдете довольно подробное описание необходимых действий для компиляции во FD.

 

Share Button

This Post Has Been Viewed 6,113 Times

Где, как и зачем использовать inline в as3?: 13 комментариев

    1. TheRabbit Автор записи

      Не получится с альтернативой толком. У нее надо много чего изменить. Слишком большой объем работы :) Хотя, конечно, это и может дать толк. Но не большой. Максимум на 10%… Всему вина архитектура самого движка A3D.

    1. TheRabbit Автор записи

      [Inline] не создает ничего нового. Он делает то же самое, что и ручной инлайн. Только до компиляции, а не внутри флешки. По-этому работать будет.

  1. Уведомление: [FlashDevelop] Настройка работы через ASC2.0 | ActionScript 3 по-русски

    1. TheRabbit Автор записи

      Ну как бы обещали, но пока не ясно. На самом деле не так много игр, которые требуют крутого двигла и мощного. Довольно много приложений способный обходиться тем же Nape и его во многих случаев хватает с головой. Главное работать на GPU с графикой, а не на CPU.

      У них более мощная работа делается — наращивают производительность ядра Air.

  2. illuzor

    Я бы ещё упомянул, что инлайн не удаляет изначальный метод, а просто добавляет его тело туда, где-он вызывается. Просто так, для справки.

    Также стоит учесть, что иногда функция с инлайном может работать не так, как без него.
    Так что стоит хорошо тестировать поведение инлайна.

  3. Вадим

    Главное Inline писать с большой буквы.
    Я тут целый вечер потратил пытаясь понять почему он не работает.
    Оказывается [inline] не прокатывает и компилятор ошибок не выдает.

  4. illuzor

    Ещё один важный момент. После компиляции с инлайном количество строк увеличивается.
    При возникновении ошибки этапа выполнения плеер указывает некий номер строки, в которой эта ошибка произошла. Так вот эта строка не будет совпадать с той, которая у вас в не скомпилённом коде.

Добавить комментарий

Ваш e-mail не будет опубликован.

Blue Captcha Image Новый проверочный код

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>