Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.09.2009, 11:28
akerman вне форума Посмотреть профиль Отправить личное сообщение для akerman Найти все сообщения от akerman
  № 1  
Ответить с цитированием
akerman

Регистрация: Sep 2009
Сообщений: 9
По умолчанию Оптимизация памяти при загрузке внешних объектов

Доброго времени суток!
Есть swf файл(графическое отображение конструктора стульев), который загружает все компоненты из вне (467 png файлов, общий вес 14 мегабайт).
Для каждого объекта честно создаётся экземпляр Loader, приблизительно так:
Код AS3:
_request = new URLRequest(_url);
this._karkas[j][i] = new Loader();
this._karkas[j][i].contentLoaderInfo.addEventListener(Event.COMPLETE, picOnLoadHandler);
this._karkas[j][i].contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, picOnLoadErrorHandler);
this._karkas[j][i].load(_request);
Всё бы ничего, и даже вес контента не пугает, но ролик при инициации загруженных объектов одним укусом съедает ~260 мегабайт оперативной памяти, что никак не допустимо.
Может кто-то сталкивался с такой проблемой?
Или загрузка большого количества графических объектов должна осуществляться как-то иначе?
Обязательным условием является то, что до инициации все компоненты должны быть уже загружены.

Старый 10.09.2009, 11:43
ToRR вне форума Посмотреть профиль Отправить личное сообщение для ToRR Найти все сообщения от ToRR
  № 2  
Ответить с цитированием
ToRR

Регистрация: Feb 2007
Сообщений: 63
загрузку надо делать очередью - по событию Event.COMPLETE начинать грузить следующее изображение, а не все сразу в цикле. проще обернуть все это в класс, конструктор которого будет получать список url'ов, а сам класс будет диспатчить тот же Event.COMPLETE, но только после загрузки всех картинок и предоставлять доступ к массиву(или куда вам там удобнее класть загруженное) картинок.
загрузили картинку - запомнили ссылку на loader.content, например, положив ее в массив, и этот же загрузчик погнали грузить дальше.

Старый 10.09.2009, 11:44
VVall вне форума Посмотреть профиль Отправить личное сообщение для VVall Найти все сообщения от VVall
  № 3  
Ответить с цитированием
VVall

Регистрация: Feb 2009
Сообщений: 1,195
Посчитайте, сколько должны занять эти ваши 467 png-файла в распакованном виде (ширина*высота*4 байт на каждый).

Старый 10.09.2009, 11:59
akerman вне форума Посмотреть профиль Отправить личное сообщение для akerman Найти все сообщения от akerman
  № 4  
Ответить с цитированием
akerman

Регистрация: Sep 2009
Сообщений: 9
Цитата:
Сообщение от VVall Посмотреть сообщение
Посчитайте, сколько должны занять эти ваши 467 png-файла в распакованном виде (ширина*высота*4 байт на каждый).
4 байта на пиксель?
флеш конвертирует каждое изображение в BMP?
467 * 400 * 300 * 4 / 1024 / 1024 = 213,775 мегабайт
похоже на правду...
а как можно решить эту проблему?
объём выделяемой памяти уменьшится, если импортировать все png-файлы в символы и вызывать их из библиотеки по необходимости?

Старый 10.09.2009, 12:12
Felicast вне форума Посмотреть профиль Отправить личное сообщение для Felicast Найти все сообщения от Felicast
  № 5  
Ответить с цитированием
Felicast
 
Аватар для Felicast

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
Цитата:
флеш конвертирует каждое изображение в BMP?
ага, только не BMP, а Bitmap.
а как еще хранить их в памяти? так поступают все графические приложения, не только флеш
(можно конечно хранить их в png, но все-равно при каждой отрисовке необходимо получать Bitmap, а это нагрузка на процессор)
Цитата:
объём выделяемой памяти уменьшится, если импортировать все png-файлы в символы и вызывать их из библиотеки по необходимости?
думаю нет. если только незначительно
__________________
я могу стать всем, если только захочу

Старый 10.09.2009, 12:19
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 6  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
нет. он всегда все распаковывает в бмп. Не загружайте заранее то, что не помещается на экране. Или загружайте и тут же выгружайте. Данные остануться в кеше браузера и в следующий раз загрузятся почти мгновенно.

Старый 10.09.2009, 12:55
akerman вне форума Посмотреть профиль Отправить личное сообщение для akerman Найти все сообщения от akerman
  № 7  
Ответить с цитированием
akerman

Регистрация: Sep 2009
Сообщений: 9
Цитата:
Обязательным условием является то, что до инициации все компоненты должны быть уже загружены.
После загрузки в ролик будут передаваться параметры конфигурации построения...
Заказчик поставил условие, что при изменении параметров, никакие компоненты не должны больше подгружаться, и результат должен быть виден сразу...

Старый 10.09.2009, 13:00
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 8  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
Вариант без подгрузки.
Положите картинки в библиотеку, пропишите им классы.
Затем, создаете экземпляры нужных картинок, когда они становятся не нужны, удаляете из памяти - Bitmap.dispose() и так далее.
__________________
Griver

Старый 10.09.2009, 13:13
akerman вне форума Посмотреть профиль Отправить личное сообщение для akerman Найти все сообщения от akerman
  № 9  
Ответить с цитированием
akerman

Регистрация: Sep 2009
Сообщений: 9
Цитата:
Сообщение от mre Посмотреть сообщение
Вариант без подгрузки.
Положите картинки в библиотеку, пропишите им классы.
Затем, создаете экземпляры нужных картинок, когда они становятся не нужны, удаляете из памяти - Bitmap.dispose() и так далее.
Прописать 467 классов?
Это не даст обратного эффекта?
Я думал об этом, но меня пугает объем рутинной работы по объявлению каждому символу названия класса...
Может есть какой-то другой способ извлечения символов из библиотеки кроме создания экземпляра класса?

Старый 10.09.2009, 13:18
mre вне форума Посмотреть профиль Отправить личное сообщение для mre Посетить домашнюю страницу mre Найти все сообщения от mre
  № 10  
Ответить с цитированием
mre
 
Аватар для mre

Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
Цитата:
Сообщение от akerman Посмотреть сообщение
Может есть какой-то другой способ извлечения символов из библиотеки кроме создания экземпляра класса?
Нет.
Вообще, флеш автоматически подставляет имя класса, соответствующее имени символа в библиотеке, поэтому прописывание можно свести к установке флажка и нажатию ok.
А в CS4 есть возможность сделать эту операцию для группы файлов.
__________________
Griver


Последний раз редактировалось mre; 10.09.2009 в 13:21.
Создать новую тему Ответ Часовой пояс GMT +4, время: 15:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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