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

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

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

Регистрация: Nov 2010
Сообщений: 22
По умолчанию Out of memory error.

Есть приложение на AIR 3.5. Загружает и визуализирует картинки, перемещает, трансформирует, накладывает фильтры и пр. При получения BitmapData из контейнера методом Draw (в целях дальнейшего преобразования в заданный формат) в простых и небольших проектах все работает нормально. Однако, при сохранении "нагруженного" контейнера AIR отваливается и выдает ошибку out of memory, При этом я не могу понять причино-следственную связь, т.к. есть, на первый взгляд, очень похожие проекты, в которых задействованы картинки практически того-же размера (1.5-3.5Mb), размер контейнера-холста у одного 3000*2000px у другого 9000*2000px и в последнем случае метод Draw(container) срабатывает нормально, а в первом получаем ошибку. Перечитал всю доступную в инет литературу. Да, вроде-бы было ограничение на общий размер BitmapData в 16 МPx, но с версии FP 11 и AIR3, оно, как-бы, снято, что отчасти подтверждается общим размером 18Мpx второго варианта. ОЗУ на компе 3Гб.

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

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

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 567
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Возможно что создается несколько экземпляров битмапдаты, и все они хранятся в памяти. А нужно рисовать все в одном. Но я могу ошибаться.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Здесь нужны телепатический способности. Мне доводилось делать проекты с картинками поркупнее, на компе с 2 гигами оперативы. Ни разу не получал такой ошибки.

Старый 18.04.2013, 19:08
AVS вне форума Посмотреть профиль Отправить личное сообщение для AVS Найти все сообщения от AVS
  № 4  
Ответить с цитированием
AVS

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

Я понимаю, что предоставленной информации недостаточно, но проект "тяжелый" и выдергивание из него отдельных кусков кода мало кому и что скажет. Попробую сформулировать, другой вопрос, который как мне кажется должен решить эту проблему, но я пока не знаю как это реализовать, т.к. глубоко не копал в этом направлении.

Представим, что у нас есть некий визуальный объект-контейнер, в который добавляется произвольное количество Loader-ов. Как я уже писал, эти компоненты могут трансформироваться произвольным образом. При этом происходит визуальное обрезание Loader-a (Bitmap), если какая-то его часть выходит за границы контейнера. Вопрос в следующем, как на ActionScript получить "чистый" BitmapData только видимой части компонента - Loadera ? Следует учесть, что компонент может быть повернут, и видимая часть может стать не прямоугольной фигурой. Пока также плохо представляю, как получить BitmapData видимой части компонента, у которого обрезка получилась с его левой стороны.

У класса Rectangle есть метод intersection(), но как его результат применить для получения нужного BitmapData мне пока не ясно. Пробовал играться с методом Draw - получается какая-то хр-нь

Если у кого есть идеи на этот счет, помогите pls.

Старый 18.04.2013, 19:24
chamele0n вне форума Посмотреть профиль Отправить личное сообщение для chamele0n Посетить домашнюю страницу chamele0n Найти все сообщения от chamele0n
  № 5  
Ответить с цитированием
chamele0n

Регистрация: Feb 2013
Адрес: Seireitei
Сообщений: 176
не совсем понятно "BitmapData только видимой части компонента", относительно самого лоадера или основного контейнера ?
схематически нарисуй как это должно выглядеть на примере одного транформированного лоадера
__________________
Personal Page
$demo = $away3d + $bullet + $pathfinding;

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

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

Приложил схему. На ней область пересечения компонента (малый прям-ник) и контейнера (большой прям-ник) в самом простом виде выделена желтым цветом. Вот BitmapData этой области мне бы и хотелось получить.
Надеюсь, что нарисовал понятно.
Изображения
 

Старый 18.04.2013, 19:53
AVS вне форума Посмотреть профиль Отправить личное сообщение для AVS Найти все сообщения от AVS
  № 7  
Ответить с цитированием
AVS

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

BitmapData необходим от компонента, т.е. Loader-a

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Самый простой способ - это собрать все в один контейнер, наложить сверху маску на требуемую часть, положить все это еще в один контейнер, сдвинув так, чтобы верхний левый угол маски совпадал с нулем этого внешнего контейнера и вот эту видимую область и отрисовать в битмапу по размерам маски.

Грубо, но работает.

Старый 18.04.2013, 20:34
chamele0n вне форума Посмотреть профиль Отправить личное сообщение для chamele0n Посетить домашнюю страницу chamele0n Найти все сообщения от chamele0n
  № 9  
Ответить с цитированием
chamele0n

Регистрация: Feb 2013
Адрес: Seireitei
Сообщений: 176
1. вычисляешь rect закрашеной области (желтой)
2. создаешь bitmapdata
3. примеяешь copyPixels
4. получаем 2й вариант на рисунке ниже

насчет относительности я имел виду итоговый результат
тоесть:
image

если нужен 1й вариант, то нужно еще применять обратную матрицу ко 2му варианту
__________________
Personal Page
$demo = $away3d + $bullet + $pathfinding;

Старый 19.04.2013, 01:05
AVS вне форума Посмотреть профиль Отправить личное сообщение для AVS Найти все сообщения от AVS
  № 10  
Ответить с цитированием
AVS

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

Примерно с этого подхода я и начинал, и именно в этом варианте получил первый out of memory. В последующем схема немного поменялась, в результате чего на других проектах (проектах, созданных в самой программе) получил общее сокращение времени получения итоговой картинки в среднем в 3 раза!, но ошибка по памяти на основном тестируемом проекте так и осталась. Дело в том, что в этом проекте есть Loader-ы видимая часть которых относительно невелика, но примененное к ним растяжение сделало их площадь в пикселах близкую и у некоторых даже чуть выше предельной (если она еще действует). Похоже FlashPlayer (AIR) все-таки каким то образом в методе Draw() учитывает и невидимые области объектов. Правда, это только мои догадки.

Добавлено через 13 минут
chamele0n

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

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

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

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


 


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


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