![]() |
|
||||||||||
|
|||||
|
Регистрация: Oct 2011
Сообщений: 46
|
Здравствуйте. Разъясните мне пожалуйста как во флеше обстоит дело с использованием памяти. Вопросов несколько:
1) Насколько я понимаю нельзя/нет_смысла полностью взять на себя контроль по использованию памяти? Всем этим занимается сборщик мусора как захочется и когда захочется ему ? 2) Локальные переменные/объекты, на сколько я понял, выгружаются из памяти автоматически после завершения работы метода. 2.1) Есть смысл в конце работы метода писать x=null; y=null; и т.д. ? 2.2) Нужно ли в конце метода удалять слушатели, повешенные на эти локальные переменные/объекты ? Они тоже автоматически будут "удаляться" после завершения метода, или нет ? 3) Для проигрывания звука при каком то событии я использую следующий код: public class Main extends MovieClip { private var snd:Sound; private var chn1:SoundChannel; public function Main() { snd=new boomSound(); chn1=new SoundChannel(); stage.addEventListener(MouseEvent.CLICK, onClick); } private function onClick(e:MouseEvent){ chn1= snd.play(); } По идее объекты Sound и SoundChannel создаются единожды, а при клике просто проигрывается звук. Но я открываю диспетчер задач, начинаю кликать в приложении, и при каждом клике (проигрывании звука) приложение сжирает пару сотен килобайт оперативной памяти. И это ведь всего лишь один звуковой файл, а если их много... 3.1) Это нормальная ситуация ? Или что я делаю неправильно ? 4) Собственно все эти вопросы возникли когда я смотрю в диспетчере задач кол-во используемой памяти моим приложением. После завершения работы приложения я зануляю(null) все переменные и объекты, удаляю все ненужные слушатели, удаляю все объекты со сцены (removeChild()). После чего нажимаю кнопку "перезапустить" и моё приложение начинает работать заново т.е. заново создаются все переменные, объекты, слушатели и т.д. И при каждом таком перезапуске я вижу что приложение сжирает еще определённое кол-во памяти. Это количество то уменьшается, то увеличивается, но в общем и целом растёт (но растёт как правило до определенного значения, и каждый раз это значение разное). 4.1) и Опять вопрос это нормально ? Это типа сборщик мусора срабатывает в разные моменты, или такого не должно быть ? Извините за поэму, но хочется разобраться... |
|
|||||
|
1. Именно. Можно только помочь ему.
2. После завершения работы функции/метода автоматом затираются только локальные переменные. Объекты будут удалены только если нет на них внешних ссылок, и не сразу, а когда GC посчитает нужным. 2.1. Нет 2.2. Нужно, если конечно они больше не нужны. 4. Так как GC не сразу освобождает память то при перезапуске ему нужна еще память. А освободив, он не отдает ее системе, ибо думает что потребуется еще.
__________________
http://www.chessmax.ru |
|
|||||
|
Регистрация: Oct 2011
Сообщений: 46
|
хм. Спасибо за пояснения. В пункте 4) я так понимаю у меня нормальная ситуация происходит ? Ничего с ней поделать я не смогу?
И по поводу звука может кто-нибудь прокомментировать ? |
|
|||||
|
Регистрация: Oct 2011
Сообщений: 46
|
Ну это у меня простейший код, для примера. А если я хочу использовать 2 канала звуков ? Или например мне нужен такой метод как stop(), он же по-моему доступен только в объекте класса SoundChanel? И ваш ответ как то связан с моей проблемой, или вы просто сделали замечание по коду ?
|
|
|||||
|
Цитата:
snd.play() каждый вызов возвращает новый SoundChannel.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Oct 2011
Сообщений: 46
|
хм... т.е. из за этого и получается выделение памяти при каждом проигрывании звука ? и мне опять ничего с этим не поделать, а ждать когда GC удалит эти каналы ?
|
|
|||||
|
Да, ждать GC.
В диспетчере задач вы не сможете адекватно оценить потребление памяти конкретным приложением, FlashPlayer всегда выделяет память с запасом и выделенная память не означает, что она используется в данный конкретный момент. Воспользуйтесь профайлером, он есть практически во всех нормальных IDE. Частично потребление памяти также можно оценить с помощью свойств класса System.
__________________
משיח לא בא משיח גם לא מטלפן |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:20. |
|
|
« Предыдущая тема | Следующая тема » |
|
|