Утечка памяти при загрузке SWF - PullRequest
0 голосов
/ 13 июня 2011

У меня есть загрузчик SWF, который запускает некоторый код в фоновом режиме и загружает другие SWF.Используя этот код:

private function loadScreensaver():void {
            screensaverSWF = new Loader();
            var req:URLRequest;
            switch(areaNumber){
                case 1 :
                    req = new URLRequest("exNorthernFrontierScreensaver.swf");
                    break;
                case 2 :
                    req = new URLRequest("exRomanEmpireScreensaver.swf");
                    break;
                case 3 :
                    req = new URLRequest("exRomanCarlisleScreensaver.swf");
                    break;
                case 4 :
                    req = new URLRequest("exRomanBritainScreensaver.swf");
                    break;
            }
            screensaverSWF.load(req);
            addChild(screensaverSWF);
            GAME_STATE = SCREENSAVER;
        }

Я загружаю заставку и добавляю ее на сцену.Используя MonsterDebugger, я вижу, что объем памяти постоянно увеличивается от 80 МБ и выше до тех пор, пока приложение не выйдет (я использую проектор Windows).Чего я не могу понять, так это того, почему к экранной заставке не прикреплен код, а только некоторые временные анимации событий, исчезающих и исчезающих.Любая идея, что здесь происходит?

РЕДАКТИРОВАТЬ: я продолжал тестирование и нашел, где у меня есть изображение, которое начинается стадии, затем включается и выключается и удаляется.Когда он повторяется, он снова добавляется в память, как будто первое изображение все еще сохраняется.Все это делается на временной шкале.

РЕДАКТИРОВАТЬ 2: http://www.rezmason.net/blog/caching-timeline-objects-in-flash Кажется, это проблема, но не дает решения.Эта заставка может работать до 6 часов в день, в тот момент, когда она выходит после 2.

Ответы [ 5 ]

3 голосов
/ 13 июня 2011

Вы никогда не очистите внешне загруженные SWF-файлы из памяти.Как только вы загрузите что-то извне, будет чудом, если потом вы увидите падение памяти.Поэтому, если вы когда-нибудь столкнетесь с ситуацией, когда вы, возможно, «загрузите» один и тот же актив более одного раза в течение срока действия SWF, вам нужно вместо этого удерживать первоначально загруженный ресурс и просто повторно использовать его.Эта функция выглядит так, как будто ее можно вызывать неоднократно, и вы просто перезагружаете уже загруженные ресурсы каждый раз, когда вы делаете это.

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

1 голос
/ 15 июня 2011

ОК, разобрался с проблемой. Появляется удаление изображений в конце анимации, а затем зацикливание анимации заставляет их многократно добавляться в память. Изображения теперь либо делаются невидимыми, либо перемещаются со сцены ближе к концу, поэтому они используются повторно.

0 голосов
/ 23 июня 2011

Если вы снова столкнетесь с этой проблемой, вкладка Object SWFWire Debugger может помочь вам найти утечку памяти, показывая список объектов, которые были добавлены или удалены (при условии, что все есть AS3).

0 голосов
/ 14 июня 2011

Я не уверен, что это исправит это, но всякий раз, когда загружается новый код, он загружается в текущий домен приложения, и вы не можете выгрузить только «некоторый» код из домена приложения.Возможно, если вы создадите новый ApplicationDomain для каждого загружаемого SWF-файла, он может получить мусор, как только вы прекратите ссылаться на него.

screensaverSWF.load(req, new LoaderContext(false, new ApplicationDomain()));
0 голосов
/ 13 июня 2011

Несмотря на то, что вы никогда не сможете выгружать код и любые встроенные изображения из удаленного SWF-файла из памяти, вы обычно можете удалить много созданных данных.Один простой способ - выполнить итерацию по каждому дочернему экрану в swf и вызвать removeChild для каждого из них.Для правильной оценки я также звоню stop() на каждого ребенка типа Movieclip.Это поможет снизить объем памяти, создаваемой изображениями / анимациями, которые используются для отображения на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...