воскресенье, 30 октября 2011 г.

Конспект / Многопоточность в Action Script / UPDATED


Краткий конспект доклада с конференции Adobe MAX 2011, на тему Concurrency In Flash Runtimes : Async ActionScript pre-alpha http://tv.adobe.com/watch/max-2011-develop/concurrency-in-flash-runtimes/ авторы: Jason Williams (senior Flash Player engineer), и Krzysztof Palacz (senior computer scientist on the virtual machine).

Сразу перейду к самым важным моментам:

0:00. Demo

Все начинается с продолжительного Demo новых возможностей.

15:00. Action Script Workers

Action Script Workers, похожа на html web workers только быстрее =) - по крайней мере тест запущенный на JS, выполнялся значительно медленнее.

В терминологии Action Script многопоточности, каждый поток называется Worker.
Основные свойства Worker-а:
1. Shared Nothing Каждый поток имеет свое адресное пространство;
2. Message Passing. Общаться между Worker-ами можно за счет "сообщений" (но, как дальше будет понятно, не с помощью привычных для нас Event-ов);
3. Shared Render Surface. Визуализация в отдельном потоке.

17:30. Life Cycling

Жизненный цикл потока.

1. создаем Worker.
var domain : WorkerDomain = WorkerDomain.current;
var url : URLRequest = new URLRequest(“some.swf”);
var worker : Worker = domain.createWorkerFromURL(url);

2. другие варианты создания потока:
createWorkerFromByteArray(bytes);
createWorkerFromWorker(worker);
createWorkerFromMain();

3. запускаем / останавливаем:
var toplevel : Promise = worker.start();
//…
var wasRunning : Boolean = worker.stop();

19:30. Worker states


Состояния Worker. Тут стоит глянуть просто на видео.
Решил не грабить картинку, т.к. не уверен, что это разрешено правообладателем.


Передумал =)

скриншот взят из доклада Concurrency In Flash Runtimes / Adobe MAX 2011

21:00. Remote Method Invocation

Коммуникация с потоком.
Promises - локальное представление объекта, находящегося в адресном пространстве Worker-а. Работа с Promise выглядит насколько изощренной:
var toplevel : Promise = worker.start();
toplevel.foo.bar();

//worker code //

package foo
{
   public function bar():void { trace(“bar”);}
}
что связано с тем что Promise дает доступ к верхнему уровню пакета Action Script кода запускаемого в Worker-е.

24:20

получение результата
var barResult : Promise = toplevel.foo.bar();

// async асинхронный запрос //

barResult.local::when(function(result:Promise):void
{
   trace(result.local::receive());
});

// sync //
// не переходит на следующую строчку //
// пока не получит ответ от потока //

var value:String = String(barResult.local::receive());

//worker code //

package foo
{
   public function bar():void { return “bar”;}
}

28:15. Passing arguments

Каждый worker обладает своим адресным пространством, при вызове функции все параметры копируются, и только копии передаются внутрь потока;
var baz : Promise = worker.start();
baz.foo(myObject);

// worker code //

public function foo(value:MyObject):void
{
   trace(value.name);
}
Wrap. Однако существует способ передачи больших объектов без копирования:
var bar : Promise = Promise.wrap(largetObj);
var baz : Promise = worker.start();
baz.foo(bar);

// worker code //

public function foo(value:Promise):void
{
   var largeObj:Object = value.local::receive();
   trace(value.name);
}
Важный момент: нельзя копировать или сериализовать экземпляры Display List

33:00. Pipelining

Работа с очередью (Queue)
Можно описывать порядок выполнения методов, которые будут запущенны один за другим
var baz : Promise = worker.start();
baz.foo();
baz.bar();
baz.foobar(“baz”);

33:45. снова Demo


37:15. Rendering (workerview)

Работа с визуальным представлением

1. указать главному потоку визуальную область, в которой мы заинтересованны.
var view : WorkerView = worker.view;
view.viewport = new Rectangle(0, 0, width, height);
addChild(view);
2. После этого мы получаем от потока Bitmap который можем отразить в главном потоке.
3. Изображение создается только на процессоре CPU.
4. Минус такого подхода в том, что главному потоку всегда отдается приоритет, поэтому вспомогательный поток может выполнятся с низким frame rate.

40:00. Runtime API (What can a worker do?)

чего не следует делать в потоке, так это использовать Native Menu – что связано с тем что в MacOS меню не может быть запущенно в отдельном потоке.

42:05. Security

Same Domain Only, а значит, если нужно в разных Application Domain, запускайте отдельные приложения. Хотя потом выяснилось, что возможно они займутся и крос-доменной коммуникаций, но только если будет подходящий запрос на фичу.

43:50. Are You in?

Линк на пре-релиз группу. Учтите надо линк вводить маленькими буквами.
adobe.ly/on6qeS

44:00. Серия вопросов


PS

Ну и орут же они порой в микрофон. В наушниках слушать не комфортно.

PPS

Естественным образом возник вопрос:
А Можно ли как-нибудь сохранить видео с MAX?
К сожалению простым способом — через FireBug в FF ничего похожего на видео-поток я не увидел. У кого-нибудь это получалось?

PPPS

Возможно я допустил где-либо неточность или опечатку. Поэтому прошу не стесняться, и указывать на место расхождения с действительность.

В связи с чем хотел бы прикрутить плагин для исправления ошибок, - с помощью которого читатель легко может выделить текст, исправить его на более правильный и отправить автору. Если вы знаете о таком плагине, пожалуйста укажите его в комментариях. Спасибо.

Update

http://anykeytocreate.blogspot.com/2012/06/worker-in-as3.html - Появилась первая официальная статья о Worker-ах от Тибо.

Комментариев нет:

Отправить комментарий

Press Any Key...