![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Nov 2010
Сообщений: 22
|
Есть приложение на 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Гб.
Может кто-нибудь поделится опытом того, как можно обойти подобную проблему или какую "технику" следует применять в данном случае. |
|
|||||
|
Возможно что создается несколько экземпляров битмапдаты, и все они хранятся в памяти. А нужно рисовать все в одном. Но я могу ошибаться.
|
|
|||||
|
Регистрация: Nov 2010
Сообщений: 22
|
Спасибо всем, кто откликнулся
Я понимаю, что предоставленной информации недостаточно, но проект "тяжелый" и выдергивание из него отдельных кусков кода мало кому и что скажет. Попробую сформулировать, другой вопрос, который как мне кажется должен решить эту проблему, но я пока не знаю как это реализовать, т.к. глубоко не копал в этом направлении. Представим, что у нас есть некий визуальный объект-контейнер, в который добавляется произвольное количество Loader-ов. Как я уже писал, эти компоненты могут трансформироваться произвольным образом. При этом происходит визуальное обрезание Loader-a (Bitmap), если какая-то его часть выходит за границы контейнера. Вопрос в следующем, как на ActionScript получить "чистый" BitmapData только видимой части компонента - Loadera ? Следует учесть, что компонент может быть повернут, и видимая часть может стать не прямоугольной фигурой. Пока также плохо представляю, как получить BitmapData видимой части компонента, у которого обрезка получилась с его левой стороны. У класса Rectangle есть метод intersection(), но как его результат применить для получения нужного BitmapData мне пока не ясно. Пробовал играться с методом Draw - получается какая-то хр-нь Если у кого есть идеи на этот счет, помогите pls. |
|
|||||
|
Регистрация: Feb 2013
Адрес: Seireitei
Сообщений: 176
|
не совсем понятно "BitmapData только видимой части компонента", относительно самого лоадера или основного контейнера ?
схематически нарисуй как это должно выглядеть на примере одного транформированного лоадера |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 22
|
chamele0n
Приложил схему. На ней область пересечения компонента (малый прям-ник) и контейнера (большой прям-ник) в самом простом виде выделена желтым цветом. Вот BitmapData этой области мне бы и хотелось получить. Надеюсь, что нарисовал понятно. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 22
|
Уточнение
BitmapData необходим от компонента, т.е. Loader-a |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Самый простой способ - это собрать все в один контейнер, наложить сверху маску на требуемую часть, положить все это еще в один контейнер, сдвинув так, чтобы верхний левый угол маски совпадал с нулем этого внешнего контейнера и вот эту видимую область и отрисовать в битмапу по размерам маски.
Грубо, но работает. |
|
|||||
|
Регистрация: Feb 2013
Адрес: Seireitei
Сообщений: 176
|
1. вычисляешь rect закрашеной области (желтой)
2. создаешь bitmapdata 3. примеяешь copyPixels 4. получаем 2й вариант на рисунке ниже насчет относительности я имел виду итоговый результат тоесть: image если нужен 1й вариант, то нужно еще применять обратную матрицу ко 2му варианту |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 22
|
mikhailk
Примерно с этого подхода я и начинал, и именно в этом варианте получил первый out of memory. В последующем схема немного поменялась, в результате чего на других проектах (проектах, созданных в самой программе) получил общее сокращение времени получения итоговой картинки в среднем в 3 раза!, но ошибка по памяти на основном тестируемом проекте так и осталась. Дело в том, что в этом проекте есть Loader-ы видимая часть которых относительно невелика, но примененное к ним растяжение сделало их площадь в пикселах близкую и у некоторых даже чуть выше предельной (если она еще действует). Похоже FlashPlayer (AIR) все-таки каким то образом в методе Draw() учитывает и невидимые области объектов. Правда, это только мои догадки. Добавлено через 13 минут chamele0n Ваш схема - как раз один из самых сложных, на мой взгляд, вариантов, который нужно реализовать. Но, честно говоря, пока не представляю каким стандартным методом и какого класса я могу получить BitmapData такой неправильной фигуры. Если не затруднит, не могли бы Вы набросать хоть небольшой кусок кода. |
![]() |
![]() |
Часовой пояс GMT +4, время: 17:40. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|