Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Работа с памятью во флеше (http://www.flasher.ru/forum/showthread.php?t=205088)

helio 17.11.2013 22:27

Работа с памятью во флеше
 
Добрый вечер. Вычитал на одном из сайтов такую методику при загрузке изображения. Цитирую один из пунктов: "Loader в дефолтном своем применении порождает утечки памяти. Поэтому если через него загружается картинка, то надо брать её BitmapData и делать bitmapData.clone(), сохраняя в другую переменную. А потом диспозить существующую картинку в Loader, а затем делать loader.unload(). Ещё на всякий случай можно cacheAsBitmap=false."

Код AS3:

var bitmapData:BitmapData = (loader.contentLoaderInfo.content as Bitmap).bitmapData.clone();
(loader.content as Bitmap).cacheAsBitmap = false;
(loader.content as Bitmap).bitmapData.dispose();
(loader.content as Bitmap).bitmapData = null;
(loader.contentLoaderInfo.content as Bitmap).bitmapData = null;
loader.unload();

В общем хотел узнать у знающих людей, насколько стоит доверять данной инфе и стоит ли использовать данный хак?

MikroAcse 17.11.2013 22:36

Если это окажется правдой (а я так думаю), то можно будет сделать утилиту:
Код AS3:

public static function getContent(loader:Loader):BitmapData {
    var infoContent:Bitmap = loader.contentLoaderInfo.content as Bitmap;
    var content:Bitmap = loader.content as Bitmap;
    var bitmapData:BitmapData = content.bitmapData.clone();
    content.cacheAsBitmap = false;
    content.bitmapData.dispose();
    content.bitmapData = null;
    infoContent.bitmapData.dispose();
    infoContent.bitmapData = null;
    loader.unload();
    return bitmapData;
}


helio 19.11.2013 00:27

У меня только такой вопрос. Если я загружаю изображение с локального диска, то как мне обратится к лоадеру после загрузки изображения? Ведь к изображению да и к лоадеру я смогу обратится только лишь после того, как будет отработано событие Event.COMPLETE

Код AS3:

private function loadCompleteHandler(event:Event):void
{       
        var data:ByteArray = _fileReference.data;
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoadCompleteHandler);
        loader.loadBytes(data);
        _fileReference = null;
}
 
private function imageLoadCompleteHandler(event:Event):void
{
        var image:Bitmap = event.target.content as Bitmap; // Как обратится к лоадеру, как показано в предыдущем посте с кодом
}


in4core 19.11.2013 01:00

Сделать лоадер полем класса например, либо e.currentTarget.loader

helio 19.11.2013 01:19

Цитата:

Сообщение от in4core (Сообщение 1152920)
Сделать лоадер полем класса например, либо e.currentTarget.loader

Попробовал второй вариант. Действительно, как то в голову не пришло, что через event.target доступно св-во loader. Вот финальный результат:

Код AS3:

private function imageLoadCompleteHandler(event:Event):void
{
        var bitmapData:BitmapData = (event.target.loader.contentLoaderInfo.content as Bitmap).bitmapData.clone();
        (event.target.loader.content as Bitmap).cacheAsBitmap = false;
        (event.target.loader.content as Bitmap).bitmapData.dispose();
        (event.target.loader.content as Bitmap).bitmapData = null;
        (event.target.loader.contentLoaderInfo.content as Bitmap).bitmapData = null;
        event.target.loader.unload();
 
        _image = new Bitmap(bitmapData);
}

Только я не до конца понимаю, действительно ли таким образом при обращении через event.target диспозится Loader.

in4core 19.11.2013 01:53

Порно ваш финальный резултат.
var content:Bitmap = event.target.loader.content as Bitmap;
а потом уже обращаться напрямую
content.cacheAsBitmap = false; и ит.п.

alatar 19.11.2013 13:45

Цитата:

Сообщение от helio (Сообщение 1152809)
Добрый вечер. Вычитал на одном из сайтов такую методику при загрузке изображения.

Цитата:

Иследования проводились только для версии 11.1 standalone debugger...
Дальше можно было не читать.
Цитата:

Сообщение от helio (Сообщение 1152809)
В общем хотел узнать у знающих людей, насколько стоит доверять данной инфе и стоит ли использовать данный хак?

Для начала необходимо подтвердить факт наличия проблемы.

Добавлено через 46 минут
P.S. Краткое описание работы с памятью.

Dukobpa3 19.11.2013 21:11

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

in4core 19.11.2013 21:24

Dukobpa3 а при работе с ВК АПИ ты тоже так скажешь? Хотя да, это наверное единственно место где печально, в остальном надо выдергивать

Dukobpa3 19.11.2013 21:26

При работе с вк апи я сделаю работу вк апи через жс, и оберну в свои адекватные интерфейсы.

Добавлено через 33 секунды
Всмысле социальный враппер будет в жс, а не во флеше. А флеш будет с моим жс общаться а не с вк напрямую.


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

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