Flash CS3 - как почистить память - PullRequest
1 голос
/ 04 мая 2011

У меня вопрос, как очистить / освободить память во флэш-памяти? Например, я заканчиваю игру и хочу начать с начала, и если я просто перейду к первому кадру, все объекты, которые еще находятся в этой памяти, есть ли какая-либо возможность принудительно очистить память?

Можно ли освободить память для объекта? например, я удаляю ребенка (что-то) - и я хочу освободить память для объекта, как я буду использовать его снова?

Кто-нибудь может мне объяснить, как работает двигатель?

Спасибо

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

Я бы посоветовал вам прочитать главу 14 «Сборка мусора» в «Книге мусора» (Essential ActionScript 3.0 от O'Reilly Publishing).

Краткий ответ на ваш вопрос: вы не вконтроль де-выделения, сборщик мусора есть.В языке с мусором, таком как AS3 или Java, у вас нет ручного управления распределением и удалением памяти, как в языках более низкого уровня;нет никаких эквивалентов AS3 для таких вещей, как delete в C ++ или free в C. Ваша цель не должна контролировать, когда вы уничтожаете вещи, а скорее не забывая удалять ссылки навещи, которые вам больше не нужны, и убедитесь, что вы отключили вещи, которые вы собираетесь использовать для сборки мусора .

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

Предыдущий респондент написал следующее:

myObject = null;

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

Достаточно сказать, что весь механизм GC является более сложным, чем это можно удовлетворительно объяснить в посте StackOverflow.Вот почему в книге Moock есть целая глава, и даже эта книга не содержит подробностей реализации или подробностей о том, когда именно проигрыватель Flash Player выполняет подсчет ссылок или удалений, а также отметок и проходов.

НаиболееИМХО важно помнить следующее:

  1. Когда вы намереваетесь «убить» объект, предоставьте ему функцию cleanUp () или destroy (), где вы делаете такие вещи, как остановка всех его таймеров., звуки, удаление слушателей и т. д. Объект будет продолжать существовать и выполнять код, пока не получит GC'd.А Flash Player откладывает сборщик мусора так долго, как только может - обычно он запускается, когда проигрывателю необходимо выделить больше оперативной памяти из вашей системы, поскольку выделение памяти - это единственное, что требует больше времени, чем выполнение метки и очистки GC.

  2. Читайте о слабых против сильных слушателей.По сути, когда у вас слабый слушатель, ссылка на слушателя игнорируется GC с меткой-зачисткой, поэтому она сама по себе не будет препятствовать сбору объекта.Но не слушайте тех, кто говорит вам «всегда используйте слабых» или «всегда используйте сильных слушателей и удаляйте их вручную», потому что есть моменты, когда каждый уместен, и поэтому выбор за вами.

1 голос
/ 06 мая 2011

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

Чтобы объект был готов к сбору данных, он не может иметь никакого соединения с другим объектом.

, так что если у вас есть объект, который имеет единственное соединение с MovieClip, и у фрагмента ролика нет другого отношения, то, если вы установите его на ноль, вы удалите его.

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

Более того, если у вас есть 2 или более видеоклипа, которые имеют сеть соединений, удаление этих объектов требует также и того, что эти соединения будут разорваны. Например, если у вас настроен уровень со многими персонажами и слушателями, удаление lavel movieClip не очистит его.

Одним из способов разрыва этих соединений является добавление событий onRemovedFromStage, которые удаляют дальнейшие дочерние элементы, слушатели и объекты. Я начал использовать расширение casaLib movieclip - CasaMovieClip , которое имеет функцию removeChildrenAndDestroy . это немного облегчает задачу, но для реализации в более старом проекте потребуется некоторое время.

Во всяком случае, вы обнаружите, что есть много сайтов, обсуждающих это, хорошее место для начала - грант блог Скиннера

1 голос
/ 04 мая 2011

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

...