Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 1,2 > кеширование и loadMovie


Автор: Ramirez 26.2.2007, 19:01
Добрый день!

Не могу понять принцип кеширования. Вот в цикле выполняю следующий код:

Код

var mc:MovieClip = this.createEmptyMovieClip("clip"+i, this.getNextHighestDepth());
mc.loadMovie("image.gif");



т.е. несколько раз подгружаю одну и туже внешнюю картинку. Мне казалось, что после первой загрузки флеш должен был засунуть ее в кеш и след. раз брать уже оттуда, но практика показывает что он загружает ее каждый раз заново. Я что-то не правильно делаю, или надо реализовывать такой кеш самостоятельно?

Автор: AntonioBanderaz 26.2.2007, 22:57
Цитата(Ramirez @  26.2.2007,  19:01 Найти цитируемый пост)
т.е. несколько раз подгружаю одну и туже внешнюю картинку. Мне казалось, что после первой загрузки флеш должен был засунуть ее в кеш и след. раз брать уже оттуда, но практика показывает что он загружает ее каждый раз заново. Я что-то не правильно делаю, или надо реализовывать такой кеш самостоятельно? 

Кэширует браузер.

Добавлено @ 22:57 
а ты всё правильно делаешь )

Автор: Ramirez 21.3.2007, 01:42
И всетаки мне не совсем понятно. Я смотрю при отладке в bandwidth profiler и он я вно показывает, что при каждом вызове loadMovie он загружает мувик заново. Как всетаки работает алгоритм кеширования, если он есть? И есть-ли разница что подгружается, клип или картинка?

Автор: AntonioBanderaz 21.3.2007, 08:14
да для браузера никакой разницы... ты ведь когда заходишь на сайт, на который ты заходишь каждый день, у тя картинки заного не грузятся в сессию, так? тут таже фигня, но не всегда, браузерные настроки везде разные... 

если ты хочешь сднлать свой механизм кеширования, это можно, но только на AS3 smile 

Автор: Ramirez 21.3.2007, 11:48
Тоесть, ты хочешь сказать, что flash player загружает данные средствами браузера? Никогда бы не подумал. Хотя вполне вероятно... Жаль в манах об этом ни слова...
А насчет своего механизма кеширования, мне кажется, что кеширование в памяти можно сделать и на AS2. Создать массив MovieClip и обертку для loader'a. Чтобы при вызове лоадера, он сначала смотрел запрошеный клип в массиве и если там нет, то загружал клип и копию в массиве сохранял... Или это не очень хорошая идея?

Автор: AntonioBanderaz 21.3.2007, 13:19
ну просто ты duplicate не сделаешь, от загруженного MC

Автор: AlDev 21.3.2007, 14:22
Цитата(AntonioBanderaz @  21.3.2007,  18:19 Найти цитируемый пост)
ну просто ты duplicate не сделаешь, от загруженного MC 

AntonioBanderaz, да ну нафиг. BitmapData зачем нужна?

Автор: AntonioBanderaz 21.3.2007, 14:49
ну дык, этож просто статика... 

Автор: szz 22.3.2007, 07:37
Мы ведь обсуждали это... не получится... БитмапДата не сохранить интерактивный свф.

Цитата
flash player загружает данные средствами браузера? Никогда бы не подумал.

  А че удивляться, плеер то в браузере и бежит )))

Единственный способ заставить кэшировать - это отправлять хедеры от сервера. 
Я например все что иднт на лоадМуви - сфвки, картинки - пропускаю через php скрипт, т.е. обращение выглядит так:

http://server.com/getforloadmovie.php?content=swfs/movie.swf

По идее передача с параметром наоборот заставляет браузер насторожиться и не кешировать.

Но если отдать перед выводом в php хедеры управлением кэша, то все начинает работать отлично, во всяком случае управляемо.
  У меня например вот такой вот getforloadmovie.php:
Код
<?
    // имя файла:
    $filename = $_REQUEST['content'];
    // давайте проверим есть ли вообще такой файл:
    if(!file_exists($filename)){
        // нету. Тогда давайте заменим картинкой, на которой написано "Такого файла нету!" 
        $filename = "some_files/no_file_image.jpg";
    }
    // на сколько дней кэшировать будем?
    $cash_days = 10;
    // характер содержимого необязательно выдавать, но на всякий случай лучше указать:
    header('Content-disposition: inline; filename="'.basename($filename).'"');
    // вываливаем хедеры для кэша:
    header('Expires: ' . gmdate('D M d G:i:s Y', time() + intval(60 * 60 * 24 * $cash_days)) . ' GMT');
    header('Cache-Control: max-age=15552000, private');
    header('Pragma: Cache');
   
    // еще хедер для типа файла:
    header('Content-Type: ' . mime_content_type($filetype));

    // и еще хедер :)   для размеров файла, чтоб браузер знал сколько ему качать вообще
    // тож необяхательно, но лучше выдать:
    header('Content-length: ' . filesize($filename));
    
   // а теперь вывалим само содержимое:
   echo file_get_contents($filename);
   // и, опять же на всякий случай, умираем насильственной смертью:
   die;
?>

Автор: Ramirez 22.3.2007, 14:34
szz, интересная идея. спасибо!

Автор: anderw 19.2.2011, 13:38
Цитата

Единственный способ заставить кэшировать - это отправлять хедеры от сервера. 


не согласен.
можно, например, сделать кэширование и средствами actionscript локально
правда в зависимости от условия это решение может оказать непростым.

но решение к приведенному примеру теоретически в as2 могло бы быть следующим:
нужно организовать свой загрузчик,
он должен создавать новый MovieClip, выставлять для него координаты,
далее "подтаскивать" в него изображение,
изображение больше не нужно - тушить, понадобилось - показывать его снова,
можно даже дублировать, если понадобилось второе

все что нужно это находить загруженное ранее изображение и соотв.объект

сам набрел сюда в поиске подобного решения...
или я не прав и все не так?

Автор: AlDev 19.2.2011, 16:35
Ну вы и некромант.
Проблема решается тупее некуда:
Код

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest(path+"?timestamp="+new Date().getTime().toString()));


то есть добавляем к запросу timestamp и радуемся

Автор: anderw 19.2.2011, 18:20
здорово! )
а если речь идет о as2, а Класс URLLoader это ActionScript 3.0 ?

Автор: SoWa 19.2.2011, 20:16
Я чего-то не понимаю?
А почему нельзя сперва эту картинку подгрузить, куданить сложить, а потом уже создавать динамически Мувиклипы и в них её засовывать?

Добавлено через 43 секунды
Ой ой, некропостинг.

Добавлено через 1 минуту и 19 секунд
Ладно, пусть будет.

Автор: anderw 19.2.2011, 20:38
SoWa
а что значит "динамически подгрузить и куда-нибудь сложить", извините )
как раз подобное я предложил, разве нет?

мои условия:
1. программирование на as2, и больше ничего нет,
2. сервер сконфигурировать не удастся, почему --военная тайна
причем это реальная задача

Автор: SoWa 19.2.2011, 22:44
Нее, динамически подгрузить - это ты придумал )
Я предложил подгрузить и запихивать в динамически создаваемые Мувиклипы:
Код

var mc:MovieClip = this.createEmptyMovieClip("clip"+i, this.getNextHighestDepth());

Вот, извини, это я понимаю под динамическим созданием.
Ведь у нас во все мувиклипы нужно одну и ту же картинку пихать, разве нет? Тогда почему бы её не вынести за цикл, скажем вот так:
var image:Bitmap = Bitmap(loader.content); - это естессно в обработчике завершения загрузки лоадера.
Теперь картинка загружена однажды и лежит себе тихо мирно.
Потом при создании мувиклипа остается вызвать mc.beginBitmapFill, и все...
Или я что-то неработоспособное сейчас предложил?

Добавлено через 1 минуту и 30 секунд
http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/flash/display/BitmapData.html#includeExamplesSummary

Автор: anderw 19.2.2011, 22:55
да, есть сомнения
Вы уверены, что это будет работать в actionscript 2.0 ??

Автор: SoWa 20.2.2011, 09:44
Уверен. Ибо beginBitmapFill там есть, и лоадеры там тоже есть.

Добавлено через 20 секунд
Но проверять мне откровенно лень smile

Автор: anderw 20.2.2011, 13:47
ok
спасибо, Дружище  smile 
все так и есть

Добавлено через 2 минуты и 54 секунды
ну, а если вот еще и player 6.0
тогда как? )

Автор: SoWa 20.2.2011, 19:29
Цитата(anderw @  20.2.2011,  13:47 Найти цитируемый пост)
ну, а если вот еще и player 6.0тогда как? )

Ого, извини, я не предполагаю, что у кого-то он еще есть(хотя всякое возможно)
Поэтому предпочитаю не работать на такую малую перспективу smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)