PDA

Просмотр полной версии : Загрузка и прорисовка изображений.


Da_Demon
12.09.2008, 19:08
Всем прив. Помогите пожалуйста, думаю многим будет интересно. Вобщем ниже кусок моего кода..
С его помощью грузятся картинки в мувик.
Проблема - загрузка происходит долго, даже если флешка запускаеться второй раз и картинки из кеша цикл бежит оч медленно... По 10 в секунду, примерно несмотря на то что большинство одинаковых.
И иногда уже по окончанию загрузки,когда прелоадер прячется рисунки появляются поочереди наглазах.


myListener.onLoadInit = function(target_mc:MovieClip) {
if (nowload < kolload) {
nowload += 1;
k = masW[nowload];
l = masK[nowload];
my_mcl.loadClip(masT[nowload], _root[l][k]);
} else {
_root.toplay1 = 1;
_root.toplay = 1;
}
};
my_mcl.addListener(myListener);

function printloc(src:String, posx:String, posy:String, ido:Number, posz:String) {
_root[posz][oname].removeMovieClip();
_root[posz].createEmptyMovieClip(oname, ido+500);
_root[posz][oname]._x = int(posx);
_root[posz][oname]._y = int(posy);
if (kolload == 0) {
my_mcl.loadClip(src, _root[posz][oname]);
kolload = 1;
masT[kolload] = src;
masW[kolload] = oname;
masK[kolload] = posz;
} else {
kolload += 1;
masT[kolload] = src;
masW[kolload] = oname;
masK[kolload] = posz;
}
}

printloc( - в цыкле из ХМЛ.

Da_Demon
15.09.2008, 13:02
Скорость цикла увеличил смешным образом - фпс в 50 поставил. Хотя каким образом эт на код повлиять могло не догадываюсь.

Но тем не мение чем быстрее происходит загрузка рисунков тем больше вероятность того что они прорисовываться на екране будут рывками.

Wolsh
15.09.2008, 14:36
Если честно, Da_Demon, я голову сломал пытаясь понять этот код. Несмотря на потрясающую ритмичность, он совершенно нечитабелен)))) Может потому что я понятия не имею кто такой masW и с чем едят oname? Посему не знаю в чем тут проблема, но так, замечание общего характера.
Зачем Вы повторяете блокmasT[kolload] = src;
masW[kolload] = oname;
masK[kolload] = posz;в блоках условия, если он не зависит от условия? Вынесите его за if else.
Реально совершенно невозможно догадаться о значениях всех этих десятков переменных, которые Вы используете. Как результат - Вы, скорее всего, не получите ответа, хотя сама тема одна из любимейших на этом форуме)))

Da_Demon
15.09.2008, 16:38
В том то и дело что не в переменных и даже не в коде суть, На всякий случай его разместил. Со скоростью разобрался.
Проблема свелась к простому.
Грузим толпу картинок в один мувик и потом те-же в другой.
В первом случае понятно появляются по мере загрузки, но во втором тоже не одновременно, уходит время на саму прорисовку изображений - как его посчитать и дождаться окончания.?

В выложенном коде убрал просто лишние фрагменты. Конечно, вполне может быть что и есть нерациональности местами, но сути это не меняет.

Wolsh
15.09.2008, 18:56
1) А, простите, что за странная необходимость грузить картинки второй раз? Я бы еще понял - клипы, но изображения-то зачем? Это уже совсем не мелкая проблема с оптимизацией...
2) Что значит как посчитать и дождаться окончания? Окончание - событие onLoadInit. Вы же его используете в своем (?) коде!

gloomyBrain
16.09.2008, 02:57
2) Что значит как посчитать и дождаться окончания? Окончание - событие onLoadInit. Вы же его используете в своем (?) коде!


нет, Wolsh, не совсем так
Дело в том, что флешу и правда нужно время на отрисовку
Особенно заметно при изменении размеров УЖЕ загруженной картинки
Выход есть - на мой взгляд это BitmapData
Т.е. я Вам, Da Demon, предлагаю вместо повторной загрузки картинки сделать вот что:
-загрузить один раз картинку
-сохранить её как BitmapData (надеюсь, хелп у Вас есть)
-отрисовывать её (битмап дату) каждый раз когда надо отобразить картинку
-использовать updateAfterEvent() (независимо от частоты кадров перерендер экрана)

Wolsh
16.09.2008, 10:35
А, вон о чем речь. Ну этого уж точно не посчитать - у когото пень 133-й, у когото кор2квад (наверно поэтому я сразу и не понял, что за задержка)).
По поводу битмапдата - не буду утверждать, что избавит от описанных задержек, тут наверно от организации все зависит, но, собственно, именно битмапДату имел в виду, когда возмущался )) двойной закачкой. Мне можно, я сам когда-то такую фигню сделал с двойной загрузкой, с ней и пришел в первый раз на форум - три года назад))) С тех пор здесь масса решений с битмапДатой появилась, я сам пару галлерей выкладывал. Поиск.

Da_Demon
16.09.2008, 14:44
1) А, простите, что за странная необходимость грузить картинки второй раз? Я бы еще понял - клипы, но изображения-то зачем? Это уже совсем не мелкая проблема с оптимизацией...
2) Что значит как посчитать и дождаться окончания? Окончание - событие onLoadInit. Вы же его используете в своем (?) коде!

Нет) второй загрузки нет никакой. Просто написал способ проблему показать. Я о втором посещении например... Тоесть если картинки грузяться с сервера - на это уходит время и они успевают прорисоватся.
Если страничка посещаеться второй рас и картинки есть в кеше, то на загрузку время не уходит вообще, onLoadInit срабатывает и все пересчитывает мол загрузил,
прелоадер как следствие прячется, а на экране во всю идет строительство.

Ну этого уж точно не посчитать - у когото пень 133-й.
Wolsh Попробуй подгрузить во флеш ролик 300 штук пнг картинок с альфаканалом. пусть даже одинаковых.

2gloomyBrain с битмапдатой, несовсем удобно картинки оч разные, в том числе и анимации и флешки маленькие...

Можно конечно решить проблему простой задержкой секунды в 2-3 после загрузки, но эт выход който некрасивый имхо. Ктому-же вдруг у кого-то действительно IBM-I..IV;)

Wolsh
16.09.2008, 15:53
Wolsh Попробуй подгрузить во флеш ролик 300 штук пнг картинок с альфаканалом. пусть даже одинаковых.Ну я и говорю проблемы с организацией))))) Я бы и хтмл страницу нафиг послал, начни она грузить 300 картинок.

Da_Demon
17.09.2008, 00:58
Ну я и говорю проблемы с организацией))))) Я бы и хтмл страницу нафиг послал, начни она грузить 300 картинок.

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

Wolsh
17.09.2008, 02:07
во флеше так не выходит если картинка эта тоже в swfВ смысле она анимированная? Потому что если нет, то проблем ровно ноль. Может Вы лучше проблему свою расскажете, а то тут такие забавные случаи бывают))))

Da_Demon
17.09.2008, 11:21
В смысле она анимированная? Потому что если нет, то проблем ровно ноль.
Она не анимированная. Но мувик в который добавляются нужно двигать, как причитал где-то здесь битмапкеш при движении тоже слетает.

Wolsh
17.09.2008, 12:44
Я начинаю чувствовать себя сексопатологом, почему из Вас все вытягивать-то приходится? Объясните, чего Вы хотите добиться, общую задачу а не придуманный Вами способ решения. Фон замостить картинкой "2х2 пикселя" - никаких проблем. И конечно, это будет клип который можно легко двигать куда надо. Загружается картинка, с нее делается битмапДата и передается в метод MovieClip.beginBitmapFill(), после чего рисуете фигуру любых размеров с этой битмап-заливкой. Кэширование векторного мувиклипа как пиксельной графики здесь абсолютно не при чем. Кроме того, "слетает" кэширование, если есть движение ВНУТРИ закэшированного клипа. Сам клипп при этом можно двигать как угодно.
Может быть все таки расскажете подробней, и мы уже решим эту задачу?

Da_Demon
18.09.2008, 10:31
Ок. Есть множество картинок в некой папке. png, swf, jpg - в основном. Фрагменты земли и забора, здания, свет, трава, небо, фон,... Из них строится "местность". из картинок 60х20 пол, 100х100 забор,... итого сечас например 280 экземпляров, Мувик шириной в 3000пх при движении скролится. Список картинок и их координаты получаю из XML.
То что иногда не успевают нарисоваться - меньшая проблема.
При использовании большого количества флешек - просто подвисает.

Wolsh
18.09.2008, 14:09
Значит надо уменьшать количество "флешек". Пусть забор будет одним клипом, внутри которого нарисован прямоугольник, залитый c помощью beginBitmapFill() вашим тайлом со штакетником))). И так со всеми. Конечно, если каждая штакетина будет отдельным мувиклипом, нагрузка чрезмерна. Реорганизация! Клипы жрут много памяти, их надо сокращать.

Da_Demon
18.09.2008, 17:34
Печально. Ну знач постараемся.