Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Free memory from bitmapdata (http://www.flasher.ru/forum/showthread.php?t=214894)

in4core 19.01.2018 00:12

Free memory from bitmapdata
 
Коллеги я так понимаю, что нельзя :

Код AS3:

var b:BitmapData = new BitmapData......
var bit:Bitmap = new Bitmap(b);
b.dispose();

Ну то есть - выкинуть из мемори битмапдату, оставив за собой только битмап, я так понимаю в памяти оно не хранится, пока битмап не на экране, а уж раз на экране, то хранится в единственном экземпляре?

ZackMercury 19.01.2018 00:27

Bitmap только ссылается на BitmapData, он не хранит её копий.
Dispose для BitmapData уничтожит изображение.
Bitmap - это просто [абстрактный] класс, который унаследован от DisplayObject, чтобы отображать BitmapData.

in4core 19.01.2018 00:45

Ну значит я все верно понял о том, что если у меня будет 1 битмапдата и 1000 битмапок, память грузить будет только 1 битмапдата, а не 1000 шутк

caseyryan 19.01.2018 05:51

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

ZergMaster 19.01.2018 11:26

Цитата:

Сообщение от caseyryan (Сообщение 1203883)
Кстати во флеше есть какая-то встроенная проверка (о которой я узнал случайно)

https://cs5.pikabu.ru/images/preview...7135185057.jpg

caseyryan 19.01.2018 17:42

Цитата:

Сообщение от ZergMaster (Сообщение 1203886)

Типа того) Точнее картинку-то он формально загрузит (загрузчики все пошлют события завершения, при чем сразу) и новую BitmapData не создаст, если такая уже была создана

Zebestov 20.01.2018 12:36

Ну т.е. если несколько экземпляров класса Loader грузят один и тот же jpg, например, то их (content as Bitmap).bitmapData — это один и тот же экземпляр BitmapData? И типо если ты диспознешь его в одном загрузчике, то он исчезнет везде?

СлаваRa 20.01.2018 20:52

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

Zebestov 20.01.2018 21:10

Если кто-то не понял сарказма СлаваRa, проговорю словами: нет, сколько экземпляров Loader-а загрузят в себя одну и ту же картинку, столько и экземпляров BitmapData, каждый из которых живет своей жизнью и занимает свою память.

P.S.
Ложное впечатление об одной BitmapData на всех могло сложиться из-за того, что Flash не грузит файлы своими средствами, а доверяет это браузеру, который кэширует и второй раз не грузит. AIR (или SA проигрыватель) тоже сам файлы не грузит. Он доверяет это дефолтному браузеру системы. На десктопе под виндой это, например IE, на яблоках — Safari, на дроидах — вот этот вот дефолтный, которому я даже имени не знаю.

caseyryan 20.01.2018 21:33

Цитата:

Сообщение от СлаваRa (Сообщение 1203899)
ну конечно же, и перед загузкой программа проверяет, что ты тот же самый файл гузишь, сохранет урлы под капотом наверное, или может потом побайтовое сравнение делает...

А ты проверь.
Откуда я это узнал. Возник у нас как-то спор с ZackMercury по поводу того, что много загрузчиков созданных одновременно, загрузят пак картинок гораздо быстрее, чем один загрузчик, который будет грузить каждую следующую картинку по завершению загрузки предыдущей. И скинул мне зак свой код, который одинаково быстро отрабатывал и со множеством загрузчиков и с одним. Разница была буквально в несколько милисекунд на сотнях картинок весом по 2 мегабайта.
Это привело меня в небольшое замешательство, потому как я был уверен, что мой подход (со множеством одновременных загрузчиков) должен точно работать быстрее. Начал копаться в причинах явления и выяснил, что он просто скопипастил одну и ту же картинку в папку 100 раз. URL'ы получились разные, но фактически данные в самой png одни и те же. Так вот все сразу встало на свои места, когда я поместил в эту папку действиетльно разные картинки. И множество загрузчиков стали загружать весь пак в несколько раз быстрее, чем один.
Объясни как это, если не с помощью проверки данных самой картинки?
Не смотрел исходники флекса и не углублялся в работу самой виртуальной среды, но что-то мне подсказывает, что там читаются заголовки файлов и, возможно, еще какие-то данные, перед тем, как принимается решение о загрузке

Цитата:

AIR (или SA проигрыватель) тоже сам файлы не грузит. Он доверяет это дефолтному браузеру системы. На десктопе под виндой это, например IE, на яблоках — Safari, на дроидах — вот этот вот дефолтный, которому я даже имени не знаю.
SA проигрыватель и AIR это все такие разные вещи. AIR читает данные напрямую с диска, сам. Не нужен ему никакой дефолтный браузер. Браузер ограничивает работу плагинов с файловой системой. А у эйр этих ограничений нет.
Я, кстати, в AIR картинки гружу с помощью FileStream

СлаваRa 20.01.2018 21:52

Код AS3:

package {
        import flash.display.Loader;
        import flash.display.LoaderInfo;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
        public class Main extends Sprite {
 
                public function Main() {
                        for (var i:int = 0; i < 10; i++) {
                                var loader:Loader = new Loader();
                                loader.load(new URLRequest("GhPICuUvwtU.jpg"));
                                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void {
                                        addChild(LoaderInfo(e.target).content);
                                });
                        }
                }
        }
}

https://www.************/s/x6xvnezmp...49-03.png?dl=0

Добавлено через 3 минуты
Я вижу 10 разных объектов BitmapData

undefined 20.01.2018 22:01

Так кто прав то?Мне тоже кажется маловероятным что в разные лоадеры суется одна и та же битмапДата.

СлаваRa 20.01.2018 22:02

Ну Костя то нам доказательства предоставит, я думаю, он же не просто так сказал, потому что ему показалось...

Zebestov 20.01.2018 22:13

Цитата:

Сообщение от caseyryan (Сообщение 1203901)
А ты проверь.

Так и сделал перед тем, как написать. Сделал два Loader-а, грузанул картинку в один, по COMPLETE грузанул в другой, кинул оба на экран, диспознул первый, второй остался.

Цитата:

Сообщение от caseyryan (Сообщение 1203901)
SA проигрыватель и AIR это все такие разные вещи. AIR читает данные напрямую с диска, сам. Не нужен ему никакой дефолтный браузер. Браузер ограничивает работу плагинов с файловой системой. А у эйр этих ограничений нет.
Я, кстати, в AIR картинки гружу с помощью FileStream

В плане обсуждаемого поведения Loader-а SA проигрыватель и AIR ведут себя одинаково (по крайней мере на мобилах, десктопный AIR я делал пару раз и конкретно с Loader-ом не работал вроде), а FileStream к теме отношения не имеет.

:P

undefined 20.01.2018 22:19

Цитата:

Разница была буквально в несколько милисекунд на сотнях картинок весом по 2 мегабайта
Кеш же.
Код AS3:

private var bmp:BitmapData;
private function init(e:Event = null):void {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        var l:Loader = new Loader();
        l.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void {
                bmp = Bitmap(LoaderInfo(e.target).content).bitmapData;
 
                var l:Loader = new Loader();
                l.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void {
                        trace(bmp==Bitmap(LoaderInfo(e.target).content).bitmapData);
                });
                l.load(new URLRequest("1.jpg"));
        });
        l.load(new URLRequest("1.jpg"));
}

в консоле - false

СлаваRa 20.01.2018 22:23

т.е. скрина дебаггера не хватило?
То что Костя написал про скорости и т.д., это вообще другая история, конечно же, но он сам это должен понять для начала...

Zebestov 20.01.2018 22:25

Цитата:

Сообщение от caseyryan (Сообщение 1203901)
Начал копаться в причинах явления и выяснил, что он просто скопипастил одну и ту же картинку в папку 100 раз.

Вот, кстати, ключевое слово "скопипастил", но не залинковал всех на одну BitmapData! Ну т.е. экономия произошла только на этапе загрузки и декодирования изображения, но clone() никуда не делся.

undefined 20.01.2018 22:25

Цитата:

т.е. скрина дебаггера не хватило?
Не видно его

Zebestov 20.01.2018 22:26

Цитата:

Сообщение от СлаваRa (Сообщение 1203908)
т.е. скрина дебаггера не хватило?

Так никто же его не видел. На форуме давно такие ссылки не видны, сюда заливать надо :)

СлаваRa 20.01.2018 22:30

по ссылке тоже перейти нельзя?

undefined 20.01.2018 22:32

можно, но там ничего нет.

Zebestov 20.01.2018 23:16

Цитата:

Сообщение от СлаваRa (Сообщение 1203912)
по ссылке тоже перейти нельзя?

Не-а =)

ZergMaster 21.01.2018 02:41

Ну да, видимо, на загрузке экономит, а память все равно выделяет для каждой новый кусок.

caseyryan 21.01.2018 10:39

Цитата:

Сообщение от Zebestov (Сообщение 1203906)
Так и сделал перед тем, как написать. Сделал два Loader-а, грузанул картинку в один, по COMPLETE грузанул в другой, кинул оба на экран, диспознул первый, второй остался.


В плане обсуждаемого поведения Loader-а SA проигрыватель и AIR ведут себя одинаково (по крайней мере на мобилах, десктопный AIR я делал пару раз и конкретно с Loader-ом не работал вроде), а FileStream к теме отношения не имеет.

:P

Да, признаю, я не прав на счет BtimapData :rolleyes: Кидайте в меня камнями :D



Сделал вот такой тест

Код AS3:

package {
        import flash.display.Bitmap;
        import flash.display.Loader;
        import flash.display.LoaderInfo;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.filesystem.File;
        import flash.net.URLRequest;
        import flash.net.URLVariables;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.utils.getTimer;
 
 
        public class URLLoaderTests extends Sprite {
 
                private var _currentUrl:        int                = 0;
                private var _loader:                Loader                = null;
                private var _urls:                        Vector.<String>        = new Vector.<String>();
                private var _useSameImages:        Boolean                = true;
                private var _textField:                TextField        = null;
                private var _startTime:                int                        = 0
                private var _operation:                String                = "";
                private const _maxTests:        int                        = 10;
                private var _curTest:                int                        = 0;
                private var _averageTimeSingle:int                = 0;
                private var _averageTimeMultiple:int        = 0;
 
                public function URLLoaderTests() {
                        _textField                                                = new TextField();
                        _textField.width                                = stage.stageWidth;
                        _textField.height                                = stage.stageHeight;
                        _textField.multiline                        = true;
                        _textField.wordWrap                                = true;
                        _textField.defaultTextFormat        = new TextFormat(null, 20, 0x000000);
                        _textField.mouseEnabled                = true;
                        addChild(_textField);
 
                        getUrls();
 
                        useSingleLoader();
                        //useMultipleLoaders();
                }
 
                private function getUrls():void {
                        _urls.fixed = false;
                        _urls.length = 0;
                        var directory:File = File.desktopDirectory.resolvePath("images" + File.separator + (_useSameImages ? "same" : "different"));
                        var listing:Array = directory.getDirectoryListing();
                        var totalFileSize:Number = 0;
                        for each (var file:File in listing) {
                                _urls.push(file.nativePath);
                                totalFileSize += file.size;
                        }
                        _urls.fixed = true;
                        log(_useSameImages ? "Используется одинаковая картинка" : "Используются разные картинки");
                        log("Общий вес файлов в папке: " + Number(totalFileSize / 1024 / 1024).toFixed(2) + " Мб");
                        log("Средний вес файла: " + Number((totalFileSize / 1024 / 1024) / listing.length).toFixed(2) + " Мб");
                        log("Запускаемое количество тестов: " + _maxTests + ". Начали! \n");
                }
 
                private function useSingleLoader():void {
                        _operation                        = _useSameImages ? "Одинаковая картинка (поочередно): " : "Разные картинки (поочередно): ";
                        _currentUrl                = 0;
                        var loader:Loader        = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadSingleComplete);
                        //log(_operation + " начато");       
                        loadNext(loader);
                        _startTime                        = getTimer();
                }
                private function onLoadSingleComplete(e:Event):void {
                        _currentUrl++;
                        var loader:Loader = (e.target as LoaderInfo).loader;
                        var image:Bitmap = e.target.content as Bitmap;
                        loadNext(loader);
                }
 
                private function loadNext(loader:Loader):void {
                        if (_currentUrl >= _urls.length) {
                                if (_curTest < _maxTests) {
                                        _averageTimeSingle += (getTimer() - _startTime);
                                        useSingleLoader();
                                        _curTest++;
                                } else {
                                        log(_operation + " Среднее время на " + _maxTests + " тестах " + (_averageTimeSingle / _maxTests) + " Мс Завершено! \n");
                                        _curTest = 0;
                                        if (_useSameImages) {
                                                _useSameImages = false;
                                                getUrls();
                                                useSingleLoader();
                                        } else {
 
                                                _useSameImages = true;
                                                getUrls();
                                                useMultipleLoaders();
                                        }
 
                                }
                                return;
                        }
                        loader.load(new URLRequest(_urls[_currentUrl]));
                }
 
                private function useMultipleLoaders():void {
                        _currentUrl                = 0;
                        _operation                        = _useSameImages ? "Одинаковая картинка (кучей): " : "Разные картинки (кучей): ";
                        for each (var url:String in _urls) {
                                var loader:Loader        = new Loader();
                                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadMultipleComplete);
                                loader.load(new URLRequest(url));
                        }
                        //log(_operation + " начато");
                        _startTime                        = getTimer();
                }
 
                private function onLoadMultipleComplete(e:Event):void {
                        _currentUrl++;
                        if (_currentUrl >= _urls.length) {
                                if (_curTest < _maxTests) {
                                        _averageTimeMultiple += (getTimer() - _startTime);
                                        useMultipleLoaders();
                                        _curTest++;
                                } else {
                                        log(_operation + " Среднее время на " + _maxTests + " тестах " + (_averageTimeMultiple / _maxTests) + " Мс Завершено! \n");
                                        if (_useSameImages) {
                                                _useSameImages = false;
                                                getUrls();
                                                useMultipleLoaders();
                                        }
 
                                }
 
                                return;
                        }
                }
 
 
                private function log(string:String):void {
                        _textField.appendText(string + "\n");
                        if (_textField.textHeight >= _textField.height) {
                                _textField.setSelection(_textField.text.length, _textField.text.length);
                        }
                }
        }
 
}


И вот такие получились результаты
Цитата:

Используется одинаковая картинка
Общий вес файлов в папке: 50.54 Мб
Средний вес файла: 1.87 Мб
Запускаемое количество тестов: 10. Начали!

Одинаковая картинка (поочередно): Среднее время на 10 тестах 962.1 Мс Завершено!

Используются разные картинки
Общий вес файлов в папке: 49.79 Мб
Средний вес файла: 1.35 Мб
Запускаемое количество тестов: 10. Начали!

Разные картинки (поочередно): Среднее время на 10 тестах 2253.1 Мс Завершено!

Используется одинаковая картинка
Общий вес файлов в папке: 50.54 Мб
Средний вес файла: 1.87 Мб
Запускаемое количество тестов: 10. Начали!

Одинаковая картинка (кучей): Среднее время на 10 тестах 282.7 Мс Завершено!

Используются разные картинки
Общий вес файлов в папке: 49.79 Мб
Средний вес файла: 1.35 Мб
Запускаемое количество тестов: 10. Начали!

Разные картинки (кучей): Среднее время на 10 тестах 282.7 Мс Завершено!


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

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