Сборка мусора - вытирать вручную ВСЕ! - PullRequest
2 голосов
/ 09 апреля 2010

Я уже некоторое время строю игру (почти готово) - Но игре нужна кнопка воспроизведения, и это большая задача.

Я знаю, что GC ужасен во флэш-памяти, но я хотел знать, есть ли способ уничтожить ВСЕ, как если бы приложение Flash только началось. Очистка памяти, игровых данных - мне не нужно беспокоиться о загрузке игры, так как она не сильно загружена данными.

Все в значительной степени живет в DataModel - но я боюсь, что если я просто очищу все переменные, у меня будут карманы потерянной памяти.

Любая идея пересылки была бы великолепна.

ура, ребята.

Ответы [ 3 ]

2 голосов
/ 09 апреля 2010

Я бы сделал это:

  1. создайте класс, который инкапсулирует всю вашу игру, под названием GameContainer или любой другой.
  2. Выполните поиск по всему исходному коду и убедитесь, что при каждом вызове addEventListener вы передаете true для аргумента «использовать слабые ссылки».
  3. В своем классе документов (или в рамочном скрипте) создайте один экземпляр GameContainer, добавьте его на сцену и больше ничего не делайте.

Теперь, когда вы хотите полностью очистить свою игру от памяти, удалите GameContainer со сцены и обнулите ссылку. Память не будет немедленно освобождена, но все в вашей игре теперь будет иметь право на освобождение. Если Flash думает, что ей нужно больше памяти, она вызовет GC, и большой осиротевший GameContainer будет уничтожен. (Приведенный выше шаг 2 не позволит вашим слушателям событий считаться ссылками на ваши объекты, и убедитесь, что все автономные объекты могут быть утилизированы.

Не уверен, что вы имеете в виду, что GC Flash ужасен. Я не могу вспомнить, слышал о каких-либо ошибок в нем. Он не уничтожит ваши объекты, если вы не будете осторожны со своими ссылками, но это верно для всей сборки мусора.

1 голос
/ 09 апреля 2010

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

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

0 голосов
/ 10 апреля 2010

Проблема со сборщиком мусора Flash заключается в том, что, насколько я знаю, вы не можете заставить его «собирать». У меня была эта проблема с программой, в которую я загружал различные внешние SWF, и иногда Flash просто не загружал их. Что вам, возможно, понадобится сделать, это сделать функцию, чтобы установить для каждой основной переменной в вашем коде значение NULL в конце игры, если вы хотите выполнить истинный сброс.

Все еще нет гарантии, но, к сожалению, я вполне уверен, что нет ярлыка для принудительного освобождения памяти.

(Для меня это означало также, что мои обработчики событий были очищены должным образом, и мои загрузчики "выгрузили") после передачи их содержимого, в случае моего внешнего загрузчика SWF.)

...