Уничтожение объектов (и их детей) снято со сцены - PullRequest
0 голосов
/ 25 января 2012

Я работаю над приложением Flex / Air (использующим PureMVC), написанным практически полностью в ActionScript 3 (т.е. мы используем очень мало Flex). Компоненты представления добавляются к объекту Canvas в главном окне приложения, и эти представления затем загружают другие видеоклипы, файлы изображений и т. Д.

Когда я удаляю вид со сцены, я делаю это, используя application.canvas.removeChild(...). Это вызывает событие в моем медиаторе PureMVC для этого представления, которое удаляет все настроенные обработчики событий, и все выглядит как денди.

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

Установка вида на null ничего не делает. Я удивлен тем, что в AS3 нет метода простого и эффективного уничтожения экранного объекта и всех его дочерних элементов.

Это единственный способ сделать это, чтобы утомительно выгрузить все фрагменты фильмов и т. Д., А затем надеяться, что Flash их очистит?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

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

Если вы удалили все видимые ссылки на объект, но он не был собран, возможно, проблема в циклических ссылках. Например, родительские и дочерние объекты ссылаются друг на друга, поэтому описанная выше обработка не сможет удалить их, пока вы не удалите все. В этих случаях объекты не будут удалены из памяти до тех пор, пока не произойдет сборка мусора (то есть, разметка). (GC относительно медленные, поэтому внутренняя структура проигрывателя оптимизируется, когда они происходят, исходя из того, сколько памяти доступно и других факторов.)

Кстати, все вышесказанное относится к всем объектам, независимо от того, являются ли они отображаемыми объектами, представлениями Flex, NetStream или чем-то еще. Для получения дополнительной информации, вот хороший обзор AS3 GC - он старый, но все еще правильный.

Но что вам следует понимать как программисту, так это то, что почти во всех случаях вам не нужно беспокоиться об этом. Удалите все ваши ссылки на объекты (и stop() их, если они играют), и пусть (сильно оптимизированный) внутренний GC решит, когда они действительно исчезнут. Если памяти становится мало, GC будет действовать, а если нет, то любое дополнительное управление памятью будет просто преждевременной оптимизацией.

0 голосов
/ 25 января 2012

Здесь есть две вещи

  1. если вы пытаетесь удалить фрагменты ролика, динамически генерируемые вашим приложением, тогда простой метод removeChild или removeChildAt эффективно удалит его со сцены.На практике для переменной устанавливается нулевое значение.
  2. если фрагменты ролика загружены извне swf 'с аудио / видео данными, то вам придется выгружать их все в правильной последовательности.stop-> unload -> удалить загрузчик из рабочей области -> уничтожить переменные (при необходимости).

В зависимости от версии флеш-плеера у вас есть различные методы типа unloadAndStop и методы класса soundmixer stopAll.

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

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