Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Торможение интерфейса Loader/BitmapData.draw (http://www.flasher.ru/forum/showthread.php?t=189184)

uglan 10.12.2012 14:47

Торможение интерфейса Loader/BitmapData.draw
 
Всем привет!

Что делается: грузится в цикле набор больших картинок(2500px+) для галереи, с асинхронной загрузкой(loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD;) то есть вроде все как надо. Затем из этих больших картинок на лету создаются мелкие превьюшки раза в 3-4 меньше оригинала и сохраняются в памяти как BitmapData

Проблем: Картинки действительно грузятся уже после появления контейнеров на экране, но во время загрузки все равно наблюдается "заморозка" интерфейса, или попросту говоря "лаги". Вопрос в том действительно ли это проблема загрузчика и асинхронная загрузка не справляется с задачей или тормоза появляются на этапе создания превью? И если второе то как понизить приоритет функции создания BitmapData и BitmapData.draw() чтобы избежать торможения интерфейса?

Спасибо!

Hauts 10.12.2012 15:00

Не проще ли привьюшки отдельными картинками хранить, а не отрисовывать с больших в рантайме?

DaFive 10.12.2012 15:01

А как они создаются-то? Вряд ли асинхронная загрузка тому причина. Скорее синхронная операция вида draw или еще чего-то.

gloomyBrain 10.12.2012 15:34

Смотрите, "асинхронная" операция загрузки на самом деле состоит из 2 частей:
1) загрузка (ждем пока к нам по сети придут все байты от сервера)
2) преобразование (мы берем байты и делаем из них уже пиксели, если так можно сказать)

Операция 2 - синхронная. То есть начали, и пока не закончили ресурсы системе не возвращаем. Очевидно, что для больших картинок (а Ваши картинки можно назвать большими) вторая операция может сильно сказываться на производительности.

uglan 10.12.2012 15:51

Цитата:

Не проще ли привьюшки отдельными картинками хранить, а не отрисовывать с больших в рантайме?
Мне нужно чтобы размер проекта был "чем меньше тем лучше" и флешка может изменяться в размерах, то есть хранить превьюшки в адекватном качестве под каждое разрешение получится тяжело, поэтому и генерю на лету из оригиналов.
Цитата:

А как они создаются-то?Вряд ли асинхронная загрузка тому причина. Скорее синхронная операция вида draw или еще чего-то
Код AS3:

var imageLoader:Loader = Loader(e.target.loader);
var bm:Bitmap = Bitmap(imageLoader.content);
 
var Hires:BitmapData = new BitmapData(bm.width,bm.height,true,0x0);
Hires.draw(bm);
 
var LoRes:BitmapData = new BitmapData(bm.width>>2,bm.height>>2,true,0x0);
LoRes.draw(bm,new Matrix(0.25,0,0,0.25,0,0));
 
var previewBMP:Bitmap = new Bitmap(LoRes);
 
previewBMP.width = _w;
previewBMP.height = _h;
previewBMP.x = _x;
previewBMP.y = _y;
previewBMP.smoothing = true;

А можно как то назначить асинхронность этому процессу?

gloomyBrain 10.12.2012 16:05

а почему не так:
Код AS3:

var hiRes:BitmapData = bm.bitmapData;

М? Вы на самом деле лишний раз копируете большую картинку без какой-либо цели

uglan 10.12.2012 16:41

Действительно... Но тем не менее остается еще одна синхронная операция по уменьшению оригинала. Я уж думал не использовать ли мне atf энкодер и atf формат вместо png. Из atf вроде можно мипмэп получить что уже само по себе является уменьшенной копией. Только он вроде только кратные размеры поддерживает.

ChuwY 10.12.2012 17:16

Можете попробовать получать уменьшенную копию с помощью ShaderJob.
Вот пример. Правда, асинхронность не прикручена.
(увы, не могу быть уверен в том, что асинхронность шейдерджоба работает вне AIR)

uglan 11.12.2012 20:13

Цитата:

Можете попробовать получать уменьшенную копию с помощью ShaderJob.
Вот пример.
Ммм...Интересный класс! Спасибо. Но, к сожалению, в моем случае он почему то не работает. Пример полностью с сайта в своей интерпретации выложил тут:
http://support.kurchenko.ru/test_shaderJob.html
битмапдата из библиотеки, 4000+ пикселей. Флаг асинхронности в моем случае установлен в false(впрочем разницы никакой), AIR3.2.
Код AS3:

job.start(false); // true flag runs the job synchronously.

Не помогло в общем:(


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

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