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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.11.2010, 19:22
AVS вне форума Посмотреть профиль Отправить личное сообщение для AVS Найти все сообщения от AVS
  № 1  
Ответить с цитированием
AVS
[+1.3 08.12.11]

Регистрация: Nov 2010
Сообщений: 22
По умолчанию Динамическая загрузка картинок

Привет всем,

Подскажите новичку, каким образом более эффективно загрузить в контейнер картинки из локальной папки. Попытался сделить "в лоб":
1) читаю содержимое папки
2) в цикле динамически создаю объекты Image (1..N), N > 50
3) вызываю метод imageN.load(file)
4) addChild(imageN)

Вроде бы все грузится и отображается, но со значительной задержкой и появляется ошибка нехватки памяти при увеличении числа картинок, что, в общем-то, и понятно. А как сдалать иначе пока не соображу? Грузить через BitmapData и выводить Bitmap? Но проблема, мне кажется, не решится.

Буду рад любой помощи или совету.
Заранее спасибо.

Старый 01.12.2010, 17:46
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 2  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Странные ошибки у вас вылазят.. Может проблема в коде, возможно он какой-то не хороший?

Старый 01.12.2010, 18:31
incvizitor вне форума Посмотреть профиль Отправить личное сообщение для incvizitor Найти все сообщения от incvizitor
  № 3  
Ответить с цитированием
incvizitor
 
Аватар для incvizitor

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
AVS, киньте код, у меня подозрение что Вы одну и ту же картинку несколько раз грузите.
__________________
ranga

Старый 01.12.2010, 18:54
Slip_91 вне форума Посмотреть профиль Отправить личное сообщение для Slip_91 Найти все сообщения от Slip_91
  № 4  
Ответить с цитированием
Slip_91
 
Аватар для Slip_91

Регистрация: May 2009
Сообщений: 25
я через flash.display.Loader() гружу. вроде всё достаточно шустро.

Код AS3:
import flash.display.Loader;
import flash.net.URLRequest;
import flash.display.Bitmap;
 
var imgLoader: Loader;
var img: Bitmap;
 
imgLoader = new Loader();
imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
imgLoader.load(new URLRequest("image.jpg"));
 
function onComplete(e:Event):void {
    img = Bitmap(imgLoader.content);
}

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

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
Сообщение от Slip_91 Посмотреть сообщение
...вроде всё достаточно шустро.
Цитата:
Сообщение от Slip_91 Посмотреть сообщение
...но со значительной задержкой
Тогда не пойму ничего. В предоставленном коде нет ничего что может тормозить.

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Я бы наверное обратил внимание на вот сюда
Цитата:
N > 50
Покажите ка вы лучше код не тот который одну картинку грузит, а тот который:
Цитата:
в цикле динамически создаю объекты Image(1..N)
и тот который:
Цитата:
3) вызываю метод imageN.load(file)
4) addChild(imageN)
Что-то мне подсказывает что небольшая оптимизация не повредит

Старый 02.12.2010, 17:44
AVS вне форума Посмотреть профиль Отправить личное сообщение для AVS Найти все сообщения от AVS
  № 7  
Ответить с цитированием
AVS
[+1.3 08.12.11]

Регистрация: Nov 2010
Сообщений: 22
Спасибо всем, кто откликнулся

Привожу начальный вариант метода:
Код AS1/AS2:
private function _showImages(con:IVisualElementContainer, path:String): void {
             // преднастроенная корневая папка
	var appDir:File = pref.getFolder();
             // path - относительный путь от корневой папки
	var photoDir:File = appDir.resolvePath(path);
	var arr:Array;
	arr = photoDir.getDirectoryListing();
	for (var i:int=0; i < arr.length; i++) {
	            var img:Image = new Image();
		img.load( File(arr[i]).url );
		img.width=100;
		img.height=100;
		img.scaleX = 1;
		img.scaleY = 1;
		con.addElement(img);
	}
}
Данный метод вызывается несколько раз в зависимости от количества локальных папок (~5), предназначенных для чтения (настраивается в приложении).
Как я уже говорил грузится долго на компе с 2гб ОЗУ.

Переделал метод по другому:
Код AS1/AS2:
private function _showImages(con:IVisualElementContainer, path:String): void {
	var appDir:File = pref.getFolder();
	var photoDir:File = appDir.resolvePath(path);
	var arr:Array;
	arr = photoDir.getDirectoryListing();
	for (var i:int=0; i < arr.length; i++) {
 
	            var imgLoader: Loader = new Loader();
		imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
		imgLoader.load(new URLRequest(File(arr[i]).url));
	}
 
	function onComplete(e:Event):void {
		var bmp: Bitmap;
		var img: Bitmap;
		var spr: SpriteVisualElement = new SpriteVisualElement();
		img = e.target.content as Bitmap ;
		img.width=100;
		img.height=100;
		spr.width = 100;
		spr.height = 100;
		spr.addChild( img );
 
		con.addElement(spr);
	}				
 
}
Второй вариант почему-то грузит не все картинки из папки (из 88 грузит 30). Это только
то, что визуально бросилось в глаза сразу.

Второй момент, можно ли как-то использовать только один объект Loader, вынеся его создание за тело цикла. Попробовал сам, но опять наткнулся на грабли - выводится только одна картинка из папки.

Буду рад любым комментариям или советам,
Заранее спасибо

Старый 02.12.2010, 18:02
Slip_91 вне форума Посмотреть профиль Отправить личное сообщение для Slip_91 Найти все сообщения от Slip_91
  № 8  
Ответить с цитированием
Slip_91
 
Аватар для Slip_91

Регистрация: May 2009
Сообщений: 25
народ кажется спутал мой пример кода загрузки картинки с кодом топикстартера))

Цитата:
Второй момент, можно ли как-то использовать только один объект Loader, вынеся его создание за тело цикла. Попробовал сам, но опять наткнулся на грабли - выводится только одна картинка из папки.
по идее всё должно быть нормально, юзайте метод imgLoader.unload() перед каждым новым load

Старый 02.12.2010, 18:14
AVS вне форума Посмотреть профиль Отправить личное сообщение для AVS Найти все сообщения от AVS
  № 9  
Ответить с цитированием
AVS
[+1.3 08.12.11]

Регистрация: Nov 2010
Сообщений: 22
Slip_91

Попробовал изменить код:
Код AS1/AS2:
...
var imgLoader: Loader = new Loader();
// imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
 
for (var i:int=0; i < arr.length; i++) {
	imgLoader.unload();
	imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
	imgLoader.load(new URLRequest(File(arr[i]).url));
...
Результат тот же - выводится только одна картинка. Может быть есть еще какие-нибудь варианты?

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

Регистрация: May 2009
Сообщений: 25
да много может вариантов.
возможно, обработчик onComplete просто не успевает выполнится до того, как в imgLoader передаётся новая картинка. таким образом получается, что отображается только последняя.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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