110. [junior] Загрузка ресурсов

junior – серия статей для начинающих ActionScript-разработчиков.
Все статьи серии:
http://flashpress.ru/blog/category/junior/

Как вы думаете, с чего начинается любая Flash-игра или просто ActionScript-приложение? Конечно каждый разработчик найдет свой ответа на это вопрос, но загрузка ресурсов – без сомнения один из первых и очень важных этапов работы Flash приложения/игры. Очень важно правильно организовать процесс загрузки ресурсов в ваше приложение, об этом мы и поговорим в данном уроке:

В следующей статье я представлю вашему внимание библиотеку классов FPLoader.swc, которая может существенно упростить процесс загрузки ресурсов.

Как организовать загрузку ресурсов

Не существует идеального алгоритма загрузки, в каждом приложение процесс загрузки определяется исходя из требований и ожиданий. Ресурсы можно загружать как целиком, так и пачками. Вы можете получать ресурсы загружая png картинки, а можно создать специальный пакет ресурсов.swf файл, в котором будут логически собраны картинки которые могу использоваться вместе (О том как создавать и использовать пакеты ресурсов читайте в статье Создание пакета ресурсов SWF). Во первых это сильно уменьшит общий объем ресурсов, во вторых скорость загрузки так же сократится, т.к. загрузка одного файла размером 1000кб произойдет быстрее чем 10 файлов по 100кб. Главное сохранить баланс, и не создавать swf пакеты с большим количество ресурсов. И еще важно помнить, если вы одновременно начнете загружать большое количество ресурсов, во флешке упадет производительность и приложение начнет “подлагивать”, а загружать по одному ресурсу – это долго, поэтому надо найти золотую середину в количество одновременно загружаемых ресурсов.

Рассмотрим небольшой пример: у вас есть Flash игра, в которой имеются несколько модулей:

  • main – Главная страница
  • fight – Страница с боем
  • private – Личный кабинет
  • store – Магазин
  • map – Карта мира

Очевидно что первым делом надо загрузить графику модуля main, а что дальше? Здесь главное что бы игрок который только что вошел в игру не ждал долго и не разочаровался в игре. Для этого можно остальные ресурсы подгружать в фоном режиме, например пока игрок читает приветствие на главной странице, пока он знакомится с главнокомандующим (главным игровым персонажем). У нас остались еще 4 модуля(fight, private, store, map), что грузить в первую очередь? Очевидно надо сперва понять что будет делать игрок после знакомства, если он попадает на страницу ознакомительного боя – значит надо загружать модуль fight, пока игрок дерется можно в фоне загрузить модуль private, т.к. после боя игроку надо будет открыть личный кабинет что бы проверить полученный опыт/урон. После посещения личного кабинета надо направить игрока в магазин(мы как разработчики ведь ходим что бы игроки что то покупали, а мы на этом зарабатывали…), поэтому автоматически загружаем модуль store. Ну а карту мира можно загружать только по требованию, например когда игрок нажал на кнопку Открыть карту. Конечно в вашей игре будет все сложнее и немного по другому, но думаю общий смысл понятен.

Определить общий размер загружаемых ресурсов и антикеш

Для отображения более точного процента загруженности ресурсов, необходимо знать общий объем загружаемых файлов до того как они начнут загружаться. Проблема в том, что средствами ActionScript нельзя определить размер загружаемого файла, пока не будет сделан запрос на сервер, а каждый запрос – это нагрузка, а если файлов много – тогда узнать общий объем становится проблематично. Есть еще и другая проблема, если у вас на сервере обновился какой нибудь файл, или например вы решили в пакет ресурсов .swf добавить новую картинку, как заставить всех клиентов обновить этот ресурс, что бы приложения не использовали закешированный браузером файл. Конечно вы можете при загрузке каждый раз в ссылку добавлять параметр ?+Math.random(), но тогда ресурсы не будут кешировать вообще ни когда, что еще хуже. Давайте рассмотрим простое решение данной проблемы. Допустим у вас все ресурсы лежат в каталоге /resources/ (они ведь у вас лежат в одном месте, и в этом месте нет ничего кроме ресурсов, правда? если нет – советую пересмотреть структуру хранения файлов на сервере). Можно написать php скрипт который проходит циклом по всем файлам и внутренним каталогам в /resources/, считывает размер этих файлов и время последней модификации(unixtime), после чего этот скрипт должен создать XML файл с описанием всех ресурсов, например так:

Этот xml файл хранит ссылку на файл, размер в килобайтах и время последней модификации. Данный скрипт можно дергать каждый раз, когда изменился хоть один файл из каталога с ресурсами /resources/. При публикации флешки в HTML, во flashvars необходимо передать ссылку на XML файл в формате:

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

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

Вы можете попробовать написать все выше сказанное самостоятельно, но если хотите воспользоваться уже готовым решением – наберитесь терпения, в следующем уроке я покажу вам библиотеку FPLoader.swc. UPD: Обзор библиотеки FPLoader читайте здесь.

Связанные статьи:

junior – серия статей для начинающих ActionScript-разработчиков.
Все статьи серии:
http://flashpress.ru/blog/category/junior/

Да прeбудет с вами Flash.
Serious Sam
Эту статью прочитали 2499 раз

Возникли вопросы по статье? Не стесняйтесь спрашивать в комментариях или любым другим способом на странице Контакты .

Присоединяйтесь к нам в социальных сетях: ВКонтакте , Twitter и Facebook
Понравилась статья? Буду благодарен если вы поделитесь ссылкой с друзьями:


Комментарии ВКонтакте:




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




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


  1. i

    Serious Sam ещё не прочёл ,но уже сразу хочется сказать – Спасибо!
    Спасибо за такую важную тему ( которую я ещё не прочёл ,но обязательно что нибудь ещё спрошу ) .
    И отдельное, Спасибо – за долгожданную ,очередную – статью! Которые, лично я ,жду как хороших новостей!

  2. i

    Serious Sam ну что сказать…Для меня вы задали новое направление в моем учении.
    За это Вам – Спасибо! Для ленивых следующий урок, будет долгожданным и очень плодотворный…
    Но почему то мне так кажется ,что меня он разочарует ,так как “чудо – php” ,который все узнает и собирает xml ,я наверное не увижу) Учить в планах php у меня нет ,если Вы не выложите ,то тогда я пойду других доставать ,чтоб сделали подобное…Но все жадные и…Ваша статья меня короче – вгнала в унынье. Потому что .пока у меня не появится такой вот “чудо – php” я не буду не чего делать )

  3. i

    Благодаря Вашей статье, начал учить php ( так бы не за что не ввязался в это дело ) и оказывается, что написать код, для Вашего метода, оказалось гораздо проще, чем может показаться на первый взгляд. Особенно если подзамучать пхпистов)
    Но мне от Вас, как от Программиста as3 , хотелось бы услышать ( в статье ) детальный подход.
    Спасибо!

  4. i

    Во первых это сильно уменьшит общий объект ресурсов, во вторых скорость загрузки так же сократится, т.к. загрузка одного файла размером 1000кб произойдет быстрее чем 10 файлов по 100кб.

    Serious Sam Скажите пожалуйста, я делаю описанное вами на примере галереи, в которой в каждой директории будет не больше двадцати широкоформатных картинки.
    Как Вы считаете, применим ли в этом случаи, подход “заталкивания” картинок в swf ?
    И самое главное – возможно компилировать это на сервере? И ещё более важно – есть ли возможность – добавлять картинки в уже скомпилированную swf.
    В общем, Ваше профессиональное мнение?)