Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.02.2012, 16:31
noobuser вне форума Посмотреть профиль Отправить личное сообщение для noobuser Найти все сообщения от noobuser
  № 1  
Ответить с цитированием
noobuser
 
Аватар для noobuser

Регистрация: Oct 2011
Сообщений: 46
Question Правильное освобождение памяти

Здравствуйте. Разъясните мне пожалуйста как во флеше обстоит дело с использованием памяти. Вопросов несколько:

1) Насколько я понимаю нельзя/нет_смысла полностью взять на себя контроль по использованию памяти? Всем этим занимается сборщик мусора как захочется и когда захочется ему ?

2) Локальные переменные/объекты, на сколько я понял, выгружаются из памяти автоматически после завершения работы метода.
2.1) Есть смысл в конце работы метода писать x=null; y=null; и т.д. ?
2.2) Нужно ли в конце метода удалять слушатели, повешенные на эти локальные переменные/объекты ? Они тоже автоматически будут "удаляться" после завершения метода, или нет ?

3) Для проигрывания звука при каком то событии я использую следующий код:
Код AS3:
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();
 
	}
boomSound я в библиотеке предварительно "Экспортирую для ActionScript".
По идее объекты Sound и SoundChannel создаются единожды, а при клике просто проигрывается звук. Но я открываю диспетчер задач, начинаю кликать в приложении, и при каждом клике (проигрывании звука) приложение сжирает пару сотен килобайт оперативной памяти. И это ведь всего лишь один звуковой файл, а если их много...
3.1) Это нормальная ситуация ? Или что я делаю неправильно ?

4) Собственно все эти вопросы возникли когда я смотрю в диспетчере задач кол-во используемой памяти моим приложением. После завершения работы приложения я зануляю(null) все переменные и объекты, удаляю все ненужные слушатели, удаляю все объекты со сцены (removeChild()). После чего нажимаю кнопку "перезапустить" и моё приложение начинает работать заново т.е. заново создаются все переменные, объекты, слушатели и т.д. И при каждом таком перезапуске я вижу что приложение сжирает еще определённое кол-во памяти. Это количество то уменьшается, то увеличивается, но в общем и целом растёт (но растёт как правило до определенного значения, и каждый раз это значение разное).
4.1) и Опять вопрос это нормально ? Это типа сборщик мусора срабатывает в разные моменты, или такого не должно быть ?
Извините за поэму, но хочется разобраться...

Старый 07.02.2012, 17:01
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 2  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
1. Именно. Можно только помочь ему.
2. После завершения работы функции/метода автоматом затираются только локальные переменные. Объекты будут удалены только если нет на них внешних ссылок, и не сразу, а когда GC посчитает нужным.
2.1. Нет
2.2. Нужно, если конечно они больше не нужны.
4. Так как GC не сразу освобождает память то при перезапуске ему нужна еще память. А освободив, он не отдает ее системе, ибо думает что потребуется еще.
__________________
http://www.chessmax.ru

Старый 07.02.2012, 17:22
noobuser вне форума Посмотреть профиль Отправить личное сообщение для noobuser Найти все сообщения от noobuser
  № 3  
Ответить с цитированием
noobuser
 
Аватар для noobuser

Регистрация: Oct 2011
Сообщений: 46
хм. Спасибо за пояснения. В пункте 4) я так понимаю у меня нормальная ситуация происходит ? Ничего с ней поделать я не смогу?
И по поводу звука может кто-нибудь прокомментировать ?

Старый 07.02.2012, 17:26
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 4  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Код AS3:
chn1=new SoundChannel();
Эта строка не нужна.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 07.02.2012, 17:32
noobuser вне форума Посмотреть профиль Отправить личное сообщение для noobuser Найти все сообщения от noobuser
  № 5  
Ответить с цитированием
noobuser
 
Аватар для noobuser

Регистрация: Oct 2011
Сообщений: 46
Цитата:
Сообщение от alatar Посмотреть сообщение
Код AS3:
chn1=new SoundChannel();
Эта строка не нужна.
Ну это у меня простейший код, для примера. А если я хочу использовать 2 канала звуков ? Или например мне нужен такой метод как stop(), он же по-моему доступен только в объекте класса SoundChanel? И ваш ответ как то связан с моей проблемой, или вы просто сделали замечание по коду ?

Старый 07.02.2012, 17:37
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 6  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
А если я хочу использовать 2 канала звуков ?
Да хоть три, смысла в этой строке не добавится.
snd.play() каждый вызов возвращает новый SoundChannel.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 07.02.2012, 17:39
noobuser вне форума Посмотреть профиль Отправить личное сообщение для noobuser Найти все сообщения от noobuser
  № 7  
Ответить с цитированием
noobuser
 
Аватар для noobuser

Регистрация: Oct 2011
Сообщений: 46
хм... т.е. из за этого и получается выделение памяти при каждом проигрывании звука ? и мне опять ничего с этим не поделать, а ждать когда GC удалит эти каналы ?

Старый 07.02.2012, 17:51
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 8  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Да, ждать GC.
В диспетчере задач вы не сможете адекватно оценить потребление памяти конкретным приложением, FlashPlayer всегда выделяет память с запасом и выделенная память не означает, что она используется в данный конкретный момент. Воспользуйтесь профайлером, он есть практически во всех нормальных IDE. Частично потребление памяти также можно оценить с помощью свойств класса System.
__________________
משיח לא בא
משיח גם לא מטלפן

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:20.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 22:20.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.