PDA

Просмотр полной версии : Понизить приоритет фоновой загрузки?


mikhailk
26.04.2012, 13:30
Перед открытием локации подкачиваются растровые данные для базовой анимации объектов на локации (условно - 200кб). После открытия локации в фоновом режиме подкачиваются растровые данные для расширенной анимации (приблизительно 700-1000кб). Подкачиваются - это значит, что загружаются изображения (10-20кб каждое) и на их основе создаются массивы битмапдат, которые составляют покадровую анимацию объектов по фазам.

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

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

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

ЗЫ. Необходимости подгрузить срочно нет. Есть необходимость подгрузить незаметно.

-De-
26.04.2012, 14:27
Возможно, тормоза создает больше не загрузка, а раскодирование. Попробовать грузить изображения урллоадером, а раскодировать и создавать битмапы потом.

Inet_PC
26.04.2012, 14:32
Возможно тормоза из-за большого количества одновременных загрузок? Может попробовать грузить небольшими партиями 5-7 штук?

mikhailk
26.04.2012, 15:14
Нет, там конвейер, грузим в один поток.
Грузим изображение, когда загрузилось - пишем в битмапу и начинаем следующую загрузку.

Насчет раскодирования - не знаю. Я ничего специально не делаю (в смысле, ничего дополнительного не создаю - беру то, что лежит в лоадере):


private static function onCurrentImageLoaded(e:Event) : void
{
var image:Bitmap = Bitmap(loader.content);
var bitmapData:BitmapData = image.bitmapData;

currentPhaseImages[currentImageIndex] = bitmapData;

currentImageIndex++;
if (currentImageIndex < objectsForLoading.length) loadNextImage();
else onCurrentPhaseLoaded();
}



Грузятся, кстати, png-шки с альфой.

Newred
26.04.2012, 15:24
и на их основе создаются массивы битмапдат
Расфасовку массивов делать в несколько подходов ? Сама загрузка тормозить не должна.

mikhailk
26.04.2012, 15:34
А собственно, никакой расфасовки-то нет.
Все происходит в той функции, код которой я привел (onCurrentImageLoaded).
Когда все изображения фазы загружены, массив currentPhaseImages передается на хранение, а для загрузки следующей фазы создается новый массив.

K.A.T.A.F.A.L.K.E.R
26.04.2012, 15:42
ImageDecodingPolicy смотрели?

mikhailk
26.04.2012, 15:50
ImageDecodingPolicy смотрели?

Нет. :)
Ну да, у меня стоит по умолчанию ON_LOAD.
Можно, конечно, поставить ON_DEMAND, но мне это ничего не даст - он же все равно отработает, когда я полезу в loader.content.

Разве что это позволит развести два процесса - загрузки и декодирования...
Но если я запущу массовое декодирование - получатся те же тормоза, вид сбоку.

-De-
26.04.2012, 16:03
Ну я в общем про декодирование писал.
Возможно, есть более подходящее время для тормозов у вас, ну там собсно при открытии локации например.

mikhailk
26.04.2012, 16:16
Возможно, есть более подходящее время для тормозов у вас, ну там собсно при открытии локации например.

Ха, так именно за время открытия локации борьба и идет.
Для меня было идеально, когда вся анимация закачивалась полностью в момент открытия локации.


Но, в принципе, всем спасибо. причины понятны. Видимо, просто добавлю таймаут при загрузке, тормоза будут разнесены по времени и не так заметны.