[ruFlash] Звук остается после выполнения removeChild

2 views
Skip to first unread message

Павел Гольцев

unread,
Jul 2, 2009, 9:48:24 AM7/2/09
to ruF...@googlegroups.com
Всем привет!
После удаления объекта с помощью removeChild программный звук, который
был создан и запущен в классе этого объекта, продолжает проигрываться.
Значит ли это, что объект не был удален мусоросборщиком и до сих пор
присутствует в памяти?
Заранее всем спасибо.

Valentin Simonov

unread,
Jul 2, 2009, 10:00:35 AM7/2/09
to ruF...@googlegroups.com
На самом деле ен факт, что весь объект все еще висит в памяти. Если создан звук, вроде бы он обратно не линкует "родительский" объект. Так что, если больше нет на него ссылок, то его уже может и не быть, а звук, а именно SoundChannel играется. Статический же SoundMixer (тут я не в курсе) вполне вероятно содержит ссылки на играющиеся SoundChannelы, так что звук не уберется никогда, если не остановится.

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

Павел Гольцев

unread,
Jul 2, 2009, 10:32:14 AM7/2/09
to ruF...@googlegroups.com
Забыл добавить, что звук запускается по таймеру. То есть для
зацикливания звука используется таймер. Судя по тому, что после
удаления объекта из stage, звук продолжает играть в цикле, таймер
продолжает срабатывать. Но разве такое может быть, если сам объект,
который содержит объект таймера, был затерт мусоросборщиком? В as2
такое было возможно с интервалами, поскольку запущенный интервал не
был привязан ни к какому объекту, а существовал глобально. В as3
вместо интервалов был введен класс Timer, объекты которого можно
создавать внутри других объектов. Но значит ли это, что при удалении
объекта, который содержит в себе объект таймера, таймер удаляется
автоматом? Или таймеры как и в случае с as2 остались глобальными, тока
поменяли функцию запуска на целый класс?
Или в моем случае все просто: объект так и присутствует в памяти,
поэтому звук и продолжает играть?

Valentin Simonov

unread,
Jul 2, 2009, 10:34:33 AM7/2/09
to ruF...@googlegroups.com
ты подписан на событие таймера ----> есть ссылка на объект.
removeChild убирает только из дисплейлиста.

Artemyev Dmitriy

unread,
Jul 2, 2009, 11:01:58 AM7/2/09
to ruF...@googlegroups.com
> ты подписан на событие таймера ----> есть ссылка на объект.
> removeChild убирает только из дисплейлиста.

как писалось в одном из блогов, что GC во флеше сам не умеет убивать
некоторые листенеры, такие как Event.ENTER_FRAME и TimerEvent.TIMER :(
Т.е. приходиться ручками их удалять насильно или же подписывать на
событие Event.REMOVE_FROM_STAGE и там проводить чистку листенеров. На
самом деле список там большой - и это плачевно

--
Flash/Flex developer
------------------------------------------------
skype: dimas_art
tel: +38 (068) 4749190
Ukraine, Crimea, Simferopol

Regards, Artemyev Dmitriy

Reply all
Reply to author
Forward
0 new messages