Бесплатно скачать Adobe Flash Player
Flash Ripper RSS Readers

Работа с памятью в ActionScript3 — геймерский подход

На DTF.ru по наводке Imugi нашлась статья Павла Наказненко с описанием работы Garbage Collector для ActionScript 3, возникающих при этом трудностей и путей их преодоления.

Автор не ограничивается описанием решения проблем, но также прикрепляет к статье два класса. Это утилиты, которые, по словам Павла, позволили ему безопасно снизить расходование памяти с 200 до 95 Мб для флэш-игры "Воплощение". Более, чем в два раза — это немало. Файлы:

WeakReference.as: класс для смягчения ссылок на объекты. Как вы наверняка знаете, сборщик мусора может утилизировать объекты, на которые нет сильных ссылок. Класс напоминает аналогичный от Гранта Скиннера, но тут есть комментарии на русском.

MemoryController.as: класс централизованного управления хаком для форсирования сборки мусора (хак типа "двойной LocalConnection"). Этот класс — неплохой пример превращения хака в законное решение решение. У данного контроллера памяти есть настраиваемые параметры, такие, как максимально допустимый / критический объем занимаемой приложением памяти, временной интервал между принудительными очистками памяти и т.п. Непонятным для меня осталось назначение метода doSimpleClean в этом классе — есть мысли?

Писал Rost, 23 Октябрь 2008 21:48

Найдены баги:

хак типа "двойной LocalConnection"

Почему бы не использовать System.gc(), или я чего то не знаю?

kutu182 - 23 Октябрь 2008 22:44

что такое gc понимаю, как работает понимаю, что такое weak reference тоже. но как это может помочь безопасно снизить расходование памяти с 200 до 95 Мб. это то weak reference безопасно? с геттером возвращающим Object (типа к черту типизацию)! System.totalMemory которая используется для мониторинга памяти показывает количество памяти съеденное всеми флеш-программами внутри этого процесса (читай внутри браузера), то есть, если человек играющий в их игру в новой вкладке откроет что-нибудь такое эдакое дизайнером написанное, 500 мегабайт кушающее, а критическое значение будет выставлено как раз в 500 мб тут начнёт срабатывать этот чудо-гц-хак (раз в секунду по умолочанию) рассчитывая, что тут у нас везде weak reference и будет он срабатывать пока юзер не закроет кривую флешку, работать с приложением естественно будет невозможно. и поправьте меня, если я ошибаюсь но System.totalMemory вроде бы показывает разные значения в разных средах.

*смотрит на код* хм, где-то я такое уже видел. *тут я раскуриваю трубку и водя увеличительным стеклом применяю метод SherlockHolmes.deduction()* судя по буковкам m и колбэкам вместо событий, автор флешерствует после msvc, а виндузятники как правило тяжело переносят расставание с любимым инструментом и привычками. не хватает контроля над памятью из сей, ох как не хватает, надо бы что-то придумать... но это все конечно мои предположения, прошу прощения, если кого-то обидел.

в биореактор

yelbota - 23 Октябрь 2008 23:03

kutu182, System.gc() работает только в debug версии.

yelbota - 23 Октябрь 2008 23:04

Думаю, что doSimpleClean пытается наворотить парочку лишних переменных в надежде, чтобы ГК сам включиться ;-).

dima - 24 Октябрь 2008 0:24

doSimpleClean() -мне кажется как спусковой крючок, инициирует работу GC дефолтовым способом.

Born - 24 Октябрь 2008 9:53

видел я эту с.-пупер статью. . сразу как захотел перелезть на AS стал интересоваться GC. А с ним-то тут полный писец >). Поправьте меня если я не прав ) )) Читал комменты каких-то неизвестных знатаков .. типа: "Ребята просто не разобрались с работой GC". А как же с ним разобраться, если в оффициальной литературе пишут что GC просто замечательно сам отрабатывает.
Вобщем было бы неплохо увидеть все-таки профессиональные подходы к решению проблемы.

foreground - 25 Октябрь 2008 14:23

вик-референс это конечно хорошо, но этого недостаточно((. В нашем приложении > 500 классов, использование памяти неуклонно растет, хак очищает не больше 2-4 мегабайт. Бывало умирал ФФ набрав под 800 мегабайт - жесть. Все листенеры проверены, куда копать непонятно.

doSimpleClean наверное нужен для заполнения пула чанков. А в то же время

В том случае, если памяти становится мало, GC пытается освободить память из-под «unused» чанков, но делает это только в пределах текущего пула.

Александр - 25 Октябрь 2008 18:42

куда копать непонятно

Запускать профайлер и профайлить память.
500 классов
- хм.. это много?

Mokus - 27 Октябрь 2008 14:54

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

как профайлить такой случай? ну видно - не собирается, а почему? класс-то пустой

Alexander - 27 Октябрь 2008 15:49

Я ратую за жёсткий подход к ссылкам, в том числе, и при добавлении слушателей.
Weak reference - для ситуаций, когда владелец кода не понимает этого кода или не хочет понимать, в частности, если код достался по наследству от какого-нибудь разгильдяя. И то, как временное решение only.

iv - 27 Октябрь 2008 15:51

когда владелец кода не понимает этого кода или не хочет понимать

пример, когда вик референсы супер решение:
Локализация.
При динамическом пеерключении локали должны автоматически менятся тексты в контролах.
Тоесть гдето в движке локализации должны быть ссылки на контролы. Если не использовать слабые ссылки, то
или
контролы не будут чистится из памяти
или
при удалении контрола надо будет явно удалять его из локализации.

2 Alexander.
хм... тяжело чтото сказать. но если б все было так плохо - эти проблемы появлялись бы у всех. может профайлер глючит.. 600М - жесть для сравнительно маленькой апп..

Mokus - 27 Октябрь 2008 17:43

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

Куда еще можно посмотреть, я смог заметить только одну закономерность, если данных для таблиц не приходит - все собирается более менее. Рендеры не сложные используются компонет флекслиба СуперТаб и СперИмейдж. Что касается имейджа(под подозрением) - очистка кэша и гц потом не освобождают память - он бажный?

Alexander - 27 Октябрь 2008 18:14

Alexander, ты имеешь в виду SuperImage от Ely Greenfield?

Рост - 27 Октябрь 2008 18:20

да, это он

Alexander - 27 Октябрь 2008 18:36

600М - жесть для сравнительно маленькой апп..

А что, количество классов и занимаемая память как-то коррелируют?

Можно сделать аппликуху из одного класса которая сожрёт всю память, какая есть и попросит добавку.

var tf = addChild (new TextField());
var a = [];
addEventListener(Event.ENTER_FRAME, function(e) {
   tf.text = System.totalMemory;
   a.push(new BitmapData(2880,2880));
});

Dan - 28 Октябрь 2008 3:23

А что, количество классов и занимаемая память как-то коррелируют?

В реальной жизни да.

Mokus - 28 Октябрь 2008 12:30

if (System.totalMemory > mWarningMemoryLimit)
{
doForcedClean();
if (mWarningFunction)
mWarningFunction();
} else if (System.totalMemory > mCriticalMemoryLimit)
{
if (mAbortFunction)
mAbortFunction();
doForcedClean();
}

наверное надо поменять местами.

StonY - 30 Октябрь 2008 16:04

В реальной жизни да.

Тогда попрошу объяснить природу данного феномена.

Dan - 31 Октябрь 2008 13:59



Это запись из категории 'Optimization'. 10 еще cвежих:

Архивы по категориям:

3D-18, Adobe AIR-38, Animation-1, Apache Ant-1, Architecture-1, ARP-1, Art-26, Articles-26, AS3-57, Books-9, Business-3, Cairngorm-3, CI-1, Classes-10, Coding-31, Community-118, Components-19, Contests-30, conventions-1, Cool-Job-10, Debug-21, Design-28, Development-84, ecology-4, EMO-2, Events-17, Extensions-2, FAQ-9, FDS-1, Flash and html-8, Flash Player-38, Flash Updates-12, flash-on-devices-1, Flash-scene-1, flash10-4, FlashLite-2, Flex-49, Flex 2-80, flex4-3, flexcamp-2, Flickr-1, FMS-2, FPUG-61, frameworks-1, Games-20, Good Job!-44, HaXe-16, Health-2, Humor-11, Ideas-14, IV-1, JavaScript-2, Job-30, JSFL-8, Links-2, Linux-3, Maps-1, Math-8, Money-16, music-1, MXML-1, Open Source-16, Optimization-4, parenting-3, Patterns-2, Personalities-27, Philosophy-4, Politics-1, posters-1, Preloading-3, Productivity-10, PureMVC-11, Pv3d-1, Rafpug-5, Red5-3, Remoting-11, Resources-21, Ruby-6, SAAS-1, Security-11, SEO-9, Silverlight-7, Sound-3, sport-4, Strategy-122, Tamarin-2, Tools-113, Training-3, Trash-8, URAFPUG-14, Urgent-1, Usability-6, Video-6, VoIP-7, Wallop-1, Wishlist-3, XML-1, Архив всех записей (большой)

За последние месяцы:

Ноя 2008: Ноябрьская встреча RAFPUG 12 — для креативных, В продолжение темы флэш-блогов, весь Ноя

Окт 2008: Ура — вторая лицензия Alternativa3D уезжает в Киев!, Влещь на глагне III IIIIIII?, весь Окт

Сен 2008: Встречайте Open Source Flash Media Server — Mammoth, Срочно нужен толковый Flex-разработчик в Харькове (+Java), весь Сен

Авг 2008: Flex Gangsta Rap Video WTF Bro?, 27 сентября — встреча UAFPUG во Львове и плюшки от Adobe, весь Авг

Июл 2008: Тенденции среди работодателей: Adobe Flex, Adobe AIR, Silverlight, Спорт спасет красоту, которая спасет мир!, весь Июл

Июн 2008: Попытка предварительных выводов о встрече аниматоров, Онлайн трансляция встречи аниматоров в Донецке, весь Июн





Примечания:
Статус документа
: в процессе
   2002-2007 Производство: Рост Прибыли · О проекте · Подписка на новости (RSS)