как flash обрабатывает сборку мусора, когда дело доходит до добавления фрагментов ролика непосредственно в другой - PullRequest
0 голосов
/ 19 января 2010

Просто любопытно, если я вложу мувиклип в другой мувиклип, и вложенный мувиклип присоединяется к пользовательскому классу.И этот пользовательский класс имеет прослушиватель Event.ENTER_FRAME.Когда я уничтожу контейнер видеоклипа, будет ли Flash избавляться от слушателей событий внутри пользовательского класса вложенного мувиклипа?

Может показаться глупым вопросом, но Flash имеет тенденцию не убивать слушателей вместе с самим мувиклипом, как только онудаляется со сцены (это если вы примените мувиклип через addChild).и это суета, когда все становится слишком сложным.Моим решением было создать единый цикл для всех моих объектов.Теперь я подошел к тому моменту, когда мне, вероятно, придется вложить несколько фрагментов ролика внутрь другого, чтобы положение вложенного фрагмента оставалось относительно.родительский мувиклип будет вращаться и масштабироваться, поэтому я предпочитаю его вкладывать.Но я узнал, как flash обрабатывает движущиеся фрагменты, которые вложены в родительский мувиклип и имеют встроенные прослушиватели кадров.надеюсь, это не слишком запутанно.спасибо!

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Ваш вопрос заключен в пару предположений о видеоклипах и поведении GC, и я думаю, что ответ на них ответит на ваш вопрос:

Когда я уничтожу контейнерный мувиклип, флэш избавится от прослушивателей событий внутри пользовательского класса вложенного мувиклипа?

Вы не можете уничтожать объекты класса в AS3, включая мувиклипы. GC уничтожает их автоматически, но только тогда, когда на них больше нет внешних ссылок. Простое удаление фрагмента ролика со сцены не «уничтожает» его в каком-либо смысле - объект все еще там, он сохраняет всех слушателей событий, вы все равно можете вращать или масштабировать его, останавливать или воспроизводить. Это все еще обычный MC во всех смыслах, просто он больше не находится на сцене, поэтому он сохраняет все свои события и слушателей, как и любой другой клип.

flash имеет тенденцию не убивать слушателей вместе с самим мувиклипом, как только он снят со сцены ...

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

addEventListener( Events.BLAH, myListener, false, 0, true);

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

Но я узнал, как flash обрабатывает движущиеся клипы, которые вложены в родительский мувиклип и имеют прослушиватели входящего кадра.

Он обрабатывает их одинаково, независимо от того, вложены они или нет. Единственное, что вам нужно знать, это то, что когда вы добавляете один MC в качестве дочернего элемента другого, каждый из них сохраняет ссылку друг на друга, поэтому ни один из них не будет кандидатом на немедленный сбор мусора, если у них есть родительский элемент. детские отношения. Если вы удалите родительский клип со сцены и уничтожите все внешние ссылки на оба клипа, то они будут кандидатами на сборщик мусора, но не до тех пор, пока не произойдет разметка. Google mark-sweep, если вы не знакомы с такого рода коллекциями, и все должно быть достаточно ясно.

Надеюсь, это поможет!

2 голосов
/ 19 января 2010

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

когда я уничтожаю контейнер мувиклип, избавится от слушатели событий внутри вложенных Пользовательский класс Movieclip?

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

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

Один из способов добиться этого - добавить слушателя в свой пользовательский класс для событий Event.REMOVED или Event.REMOVED_FROM_STAGE. Внутри обработчика любого из этих событий вы можете удалить любых слушателей и отменить ссылку на любые объекты, которые могут заставить сборщик мусора игнорировать любые другие подходящие объекты. Этот подход позволяет вам удалять экземпляры вашего пользовательского класса со сцены, используя removeChild (myCustomInstance) и вызывая любую очистку в одном аккуратном вызове метода.

PsuedoCode:

public class MyCustomDisplayObject 
{
     public function MyCustomDisplayObject()
     {
          addEventListener( Event.ENTER_FRAME, onEnterFrameHandler );
          addEventListener( Event.REMOVED_FROM_STAGE, onRemovedHandler );
     }

     protected function onRemovedHandler( event:Event )
     {
          removeEventListener( Event.ENTER_FRAME, onEnterFrameHandler );
          removeEventListener( Event.REMOVED_FROM_STAGE, onRemovedHandler );
     }
}

Вы также можете захотеть использовать weakReference, установленный в true, в ваших вызовах на addEventListener. У меня нет большого опыта работы с weakReference, так как я предпочитаю удалять ссылки вручную.

Вот небольшая статья от Adobe о Flash Player GC: * ​​1027 *

http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html

...