Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Новости и события (http://www.flasher.ru/forum/forumdisplay.php?f=55)
-   -   Adobe AIR 3.9 Beta - теперь с workers для Android! (http://www.flasher.ru/forum/showthread.php?t=203159)

Astraport 04.09.2013 10:46

Adobe AIR 3.9 Beta - теперь с workers для Android!
 
С мобильными не дописал в заголовке.
Правда пока только под Андроид и с ограничениями.
Ну и вроде как уменьшено время компиляции под iOS, сейчас буду проверять. И разное по мелочи.

Скачать Adobe AIR 3.9 Beta

C4Grey 07.09.2013 22:10

Круто, но даже не знаю, стоит ли переводить async-функционал с ANE на Flash...на iOS вряд ли так же быстро у Adobe получится ввести поддержку мультипоточности, особннно в представлении FlashPlayer-а(где каждый Worker, по сути, является еще одной флешкой). Да и скорость нативного кода повыше будет(у меня там правка и разбор HTML, довольно мучительный процесс). Вот это еще заинтересовало:
Цитата:

Mobile Support for Background Execution in “Direct” Render Mode – AIR now supports background execution of code on iOS and Android when render mode is set to “direct”. This will allow your applications to perform tasks such as audio playback even when invisible to the user. Due to power and CPU considerations, we recommend reviewing our release notes for additional details and guidance.
Возможно, я что-то делал не так, но под iOS приходилось специально выставлять
Код AS3:

SoundMixer.audioPlaybackMode = AudioPlaybackMode.AMBIENT;

чтобы на фоне не играла музыка из игры(останавливать звуки было невозможно в силу убогости API менеджера звуков, который не было времени переписывать) :) Возможно, имеется в виду, что теперь это документированная фича, работающая и под Andorid...
P.S.
Дочитал release notes, понял в чем соль - Starling у меня останавливался при событии DEACTIVATE, вызовов отрисовки OpenGL на фоне не происходило, и все работало...А теперь при попытке вызова практически любого метода API Stage3D в фоне будет генерироватся ошибка с кодом 3768.
P.P.S Упс, перепутал, это для отключения звуков при блокировке экрана было нужно...

Astraport 08.09.2013 00:56

C4Grey, ничего не понял. Я тоже таким методом пользуюсь чтобы звук не играл на iOS. А что не так?

Мне вот интересно. Самые проблемные места в одном приложении когда отрисовывается битмапдата. Это иногда, если фотка большая, по 5-10 секунд длится и девайс все это время не реагирует ни на что. Можно ли для ускорения такого процесса как-то использовать workers?
Ну понятно, что прелоадер вероятно теперь анимированный можно запустить, а вот как-то сам процесс можно оптимизировать?

C4Grey 08.09.2013 16:51

Цитата:

Сообщение от Astraport (Сообщение 1145765)
C4Grey, ничего не понял. Я тоже таким методом пользуюсь чтобы звук не играл на iOS. А что не так?

Да это я не так понял, оказывается, под iOS, если в фоне приложение будет работать с OpenGL, система его закроет. Теперь вместо внезапного закрытия при попытке вызова отрисовки в фоне(или любого другого метода Stage3D) получим ошибку. Но так как при работе с Stage3D всегда останавливал отрисовку при деактивации приложения, то и не был осведомлен об этой особенности :)
Цитата:

Сообщение от Astraport (Сообщение 1145765)
Можно ли для ускорения такого процесса как-то использовать workers?

Ускорить можно работу каких-то алгоритмов, используя Crossbridge(собрать библиотеку, и работать с ней в другом потоке). Если тормозит сам плеер(внутренний метод отрисовки), то с этим ничего не поделать, наверное, только работать в другом потоке. Но все равно, это приятная и нужная фича :)

Astraport 08.09.2013 22:20

Если говорить конкретнее, то вот самая обыденная задача - выбрать из галереи устройства фотку и отобразить на сцене. Если это ретина устройства, то фотки бывают по 3-4 Мб весят и все замерзает на несколько секунд. Вот можно здесь приспособить воркеры чтобы быстрее процесс происходил?


Код AS3:

var tempBD:BitmapData = (LoaderInfo(e.target).content as Bitmap).bitmapData;
panelClass.setBitmapData(tempBD);
 
 
//panelClass
public function setBitmapData(source:BitmapData):void
{
var s:Number = Math.min(tW / source.width, tH / source.height);
s = Math.min(1, s);
 
bitmapData = new BitmapData(source.width * s, source.height * s, false, 0x0);
bitmapData.draw(source, new Matrix(s, 0, 0, s), null, null, null, true);
 
var drawImage:Image = new Image(Texture.fromBitmapData(bitmapData));
addChildAt(drawImage,0);
}

И подобных процессов у меня не мало.

C4Grey 09.09.2013 09:01

По оптимизациям:
1. copyPixels, если не ошибаюсь, быстрее draw.
2. Texture.fromBitmapData - по-моему, это синхронная операция, в отличии от загрузки ATF, где можна указать async-callback(догадываюсь, там используется нечто вроде PBO, но не могу понять, почему Adobe не используют его же и для несжатых данных). Но в галерее устройства фотки вряд ли хранятся в ATF, так что этот вариант отпадает :).
Была одна идея - ATF вроде как может быть контейнером для обычного RGBA:
Цитата:

Well, you may want to use uncompressed textures but still want to leverage cubemap, automatic mipmap support or even texture streaming.
И вот можно бы попробовать создавать во время работы ATF-контейнер с нашей BitmapData прямо в AS, и загружать его в видеопамять асинхронно. Но тут будет порядочный перерасход памяти на дублирование данных в ATF(хоть и временный), да и непонятно, быстрее ли это будет :)
P.S.
Проверил:
Код AS3:

public function Encode(AQuantization:int = 100):void
{
        var vEncoder:JPEGXREncoderOptions = new JPEGXREncoderOptions(AQuantization);
        var vBytes:ByteArray = new ByteArray();
        var vStart:uint = getTimer();
        FTest.bitmapData.encode(FTest.bitmapData.rect, vEncoder, vBytes);
        Cc.logch(this, 'Complete in ' + uint(getTimer() - vStart) + ' ms');
}

На PC с i3 это занимает около 450-500 мс для текстуры 4302x1080(первое, что под руку подвернулось), с минимальным уровнем сжатия, так что для мобильных не вариант(да и на РС не особо чем-то поможет, разве что для каких-то редакторов уровней можно конвертор приделать).

Astraport 09.09.2013 11:28

C4Grey, спасибо что потратил время на тестирование и разбор моей проблемы.

copyPixels быстрее, но там у меня скалирование до нужных размеров (чтобы UI поместилось и лишнюю память не жрало). Поэтому draw.

alexcon314 09.09.2013 12:07

Сказать по честному, с айр на "вы", тем более с новейшими фичами типа воркеров..но все же, стало интересно.
Невозможно вынести код, содержащий BitmapData#draw() и трансформации в код воркера? А по комплиту в основном потоке забирать картинку?

Astraport 09.09.2013 12:12

Ну вот что-то такое я и хочу, но не знаю как.
Вообще примеров использования workers для as3 пока очень мало. А для работы с графикой нашел всего один.

alexcon314 09.09.2013 12:31

Ну, а что смущает? Вроде все по делу в примере:)
Правда, вторая флешка (где воркеры работают) как-то не очень себя ведет адекватно порой, было так что область отрисовки почернела и восстановилась потом..
Но можно попробовать другие способы запуска кода в врокере, через ембедд-swf, к примеру. Хотя, сдается мне, что узким местом тут являются каналы и шаред-свойства.


Часовой пояс GMT +4, время: 17:07.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.