Загрузка изображений во Flex приводит к увеличению объема памяти в Internet Explorer 7 (и других браузерах) - PullRequest
1 голос
/ 29 июня 2009

Загрузка изображений во Flex (размер <100 КБ) приводит к увеличению памяти IE7 на мегабайт на изображение. Что тут происходит? Вот код, который у меня есть - это для каждого изображения: </p>

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_Error, Retry);//retry it
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,
  function(event:Event):void
  {
    var bitmap:Bitmap = (e.target.loader as Loader).content as Bitmap;
    // save it & Load next
  });
loader.load(new URLRequst( imageURL ));

Это также происходит в Chrome (2.0.172.33) и Firefox (3.0.10). Как можно уменьшить использование памяти? Спасибо!

Ответы [ 3 ]

5 голосов
/ 30 июня 2009

Не думаю, что увеличение примерно на 1 Мбайт на изображение - это то, о чем нужно беспокоиться. Вы указываете, что изображения меньше, чем 100 Кб, но вы, вероятно, смотрите не на тот номер: например, jpg размером 640x480, который я только что отправил, занимает ~ 48 Кб, но если вы выполните математику, то необработанный изображение занимает 900 Кб (640 * 480 * 3 = 921 600). А если вы используете прозрачность, умножьте на 4 вместо 3. Дело в том, что игрок должен распаковать изображение, чтобы манипулировать им. Хранение только необработанных байтов для такого изображения может занять 1 мег или более (в зависимости от его размера).

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

1 голос
/ 29 июня 2009

Существуют ли какие-либо браузеры или комбинации браузеров / ОС, в которых вы не сталкивались с этой проблемой?

Я преодолел пару трудных проблем с памятью и обнаружил, что Profiler более чем стоит дополнительные 500 долларов за лицензию Flex Pro, если это вариант для вас.

Я не знаю, почему вы видите скачок в 1 м каждый раз, когда загружаете изображение, но я знаю, что браузер запрашивает куски памяти у ОС, когда видит, что ему требуется дополнительная память - что-то вроде покупки оптом. Таким образом, имеет смысл, что увеличение памяти будет больше, чем необходимо.

Возможно, я (возможно) отошел от этого, но анонимная функция, используемая для обработки завершенного события, чувствует, что она может вызвать утечку памяти для вас. Я думаю, что contentLoader не может быть удален и содержит копию bytearray изображения. Это не исследованная теория - если у меня будет время сегодня или завтра, я посмотрю, смогу ли я что-нибудь сделать и подкрепить это (или исправить себя).

0 голосов
/ 29 июня 2009

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

Может быть, лучше просто сохранить imageURL в ArrayCollection, а затем ссылаться на него, привязав его к самому изображению ... например

<mx:Image source="{myAC.getItemAt(6).imagePath}" ...

or   var tmpImage:Image = new Image();
     tmpImage.source = myAC.getItemAt(i).imagePath;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...