Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Выгрузка swf с Vector.<T> (http://www.flasher.ru/forum/showthread.php?t=172730)

fljot 15.12.2011 23:05

Выгрузка swf с Vector.<T>
 
Если в модуле есть вектор сложного типа, например Vector.<Sprite>, то имеем утечку памяти.
С простым вектором всё впорядке.
(для чистоты эксперимента модуль компилить в релизном режиме)
Mac, AIR3. Можете проверить под Windows?

https://gist.github.com/5a277685cfcbed6e8ccb

wvxvw 16.12.2011 03:04

Долго думал, как бы такое протестировать, но ничего не придумал - а как именно виден результат?
Ниже мои логи из дебаггера:
Код:

r /home/wvxvw/Projects/as3-tests/bin/Shell.swf
Adobe fdb (Flash Player Debugger) [build 14159]
Copyright (c) 2004-2007 Adobe, Inc. All rights reserved.
(fdb) Attempting to launch and connect to Player using URL
/home/wvxvw/Projects/as3-tests/bin/Shell.swf
Player connected; session starting.
Set breakpoints and then type 'continue' to resume the session.
[SWF] home/wvxvw/Projects/as3-tests/bin/Shell.swf - 38,963 bytes after decompression
(fdb) b Shell.as:40
Breakpoint 1: file Shell.as, line 40
(fdb) b Shell.as:27
Breakpoint 2: file Shell.as, line 27
(fdb) c
Breakpoint 2, load() at Shell.as:27
 27        if (loader)
(fdb) n
 30        loader = new Loader();
(fdb) n
 31        addChild(loader);
(fdb) n
 32        var context:LoaderContext = new LoaderContext();
(fdb) n
 33        context.applicationDomain = new ApplicationDomain();
(fdb) n
 34        loader.load(new URLRequest("Module.swf"), context);
(fdb) n
 35    }
(fdb) n
[SWF] home/wvxvw/Projects/as3-tests/bin/Module.swf - 1,419 bytes after decompression
Execution halted, onMouseOut() at PushButton.as:173
 173  // code goes here
(fdb) n
 175  // code goes here
(fdb) c
Additional ActionScript code has been loaded from a SWF or a frame.
To see all currently loaded files, type 'info files'.
Set additional breakpoints as desired, and then type 'continue'.
(fdb) info files
---
FontAsset.as#6
IFlexAsset.as#5
mx_internal.as#8
---
Component.as#2
Label.as#7
Module.as#10
PushButton.as#3
Shell.as#1
Style.as#4
(fdb) info swfs
Shell.swf - 38,963 bytes after decompression, 8 scripts [#1 - #8]+ remaining source is still being loaded, url is fi
le:///home/wvxvw/Projects/as3-tests/bin/Shell.swf                                                                 
Module.swf - 1,419 bytes after decompression, 1 scripts [#10 - #10]+ remaining source is still being loaded, url is
file:///home/wvxvw/Projects/as3-tests/bin/Module.swf                                                             
(fdb) c
Breakpoint 1, unload() at Shell.as:40
 40        if (!loader) return;
(fdb) n
 42        removeChild(loader);
(fdb) n
 43        loader.unloadAndStop(true);
(fdb) n
 44        loader = null;
(fdb) n
 45    }
(fdb) n
[UnloadSWF] home/wvxvw/Projects/as3-tests/bin/Module.swf
Execution halted, onMouseOut() at PushButton.as:173
 173  // code goes here
(fdb) n
 175  // code goes here
(fdb) c
Breakpoint 1, unload() at Shell.as:40
 40        if (!loader) return;
(fdb) info files
---
FontAsset.as#6
IFlexAsset.as#5
mx_internal.as#8
---
Component.as#2
Label.as#7
Module.as#10
PushButton.as#3
Shell.as#1
Style.as#4
(fdb) info swfs
Shell.swf - 38,963 bytes after decompression, 8 scripts [#1 - #8]+ remaining source is still being loaded, url is fi
le:///home/wvxvw/Projects/as3-tests/bin/Shell.swf                                                                 
(fdb) c
q
Do you want to attempt to halt execution? (y or n) y
Attempting to halt.
To help out, try nudging the Player (e.g. press a button)
Execution halted in 'Module.swf' at 0x00009890 (39056)
(fdb) q
The program is running.  Exit anyway? (y or n) y

Process terminal finished


fljot 16.12.2011 03:35

Олег, вот я сделал ещё версию для лёгкого теста https://dl.************/s/i1yqq9e9spp...duleLoader.swf
код: https://gist.github.com/5a277685cfcbed6e8ccb (добавил)

Память нифига не чистится — вот как видно. Подгружаемый модуль — он же ужас какой элементарный.
Человек тут говорит вот FP 10.3 Win — всё впорядке. А на 11ом и AIRе, похоже, того.

i.o. 16.12.2011 04:24

А если так? Изменится ли что-нибудь?
Код AS3:

removeChild(loader);
var s:Sprite = new Sprite();
s.removeChild(s.addChild(loader.content));
loader.unloadAndStop(true);
loader = null;


fljot 16.12.2011 04:29

Цитата:

Сообщение от i.o. (Сообщение 1051823)
А если так? Изменится ли что-нибудь?

Неа.

Я дома под виндами попробовал — 11.1 тоже глючит. И на андроиде тоже. А 10.3 вроде нормально. Народ, есть кто на десктопном линуксе?

... заполнил баг https://bugbase.adobe.com/index.cfm?...bug&id=3071138

i.o. 16.12.2011 05:18

Цитата:

заполнил баг https://bugbase.adobe.com/index.cfm?...bug&id=3071138
отдал свой голос. А то исправляют годами..

fljot 16.12.2011 05:26

Я ведь не галлюцинирую?

mayakwd 16.12.2011 10:40

Цитата:

Сообщение от fljot (Сообщение 1051826)
Я ведь не галлюцинирую?

Определенно нет, пойду свой код проверять...
vote[+]

DaFive 16.12.2011 10:46

Проголосовал, зацепил бы им аттач туда с тестом.

Добавлено через 1 минуту
Сейчас посмотрю в Ubuntе.

Добавлено через 1 час 15 минут
Подтверждаю на ubuntе. Плеер 10, память растёт.

wvxvw 16.12.2011 13:15

Я могу предположить как может получаться утечка памяти - определение вектора создается по факту использования, за исключением векторов для примитивных типов, для которых существуют специальные отдельные классы. И это определение потом мешает выгрузить всю флешку.
Но я не вижу каким образом тест это проверяет :S Нужен какой-нибудь ожидаемый и какой-нибудь действительный результат. Например, если бы в загружаемой флешке было два кадра и на одном из них был бы trace(), если после выгрузки трейсы не пропали бы - можно было бы утверждать, что выгрузить не получилось.
Еще я не уверен, что будет если попробовать getDefinitionByName("__as3__.vec.Vector.&lt;Sprite>") или как там записывается имена векторов.


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

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