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

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

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

Регистрация: May 2009
Сообщений: 134
По умолчанию Можно ли так удалять объекты?

Всем добрый день.
есть вспомогательная переменная
Код AS3:
private var target:DisplayObject;
есть такая функция
Код AS3:
private function deleteOb(nameOb:String = "NoName"):void {
		target = null;
		target = sprMain.getChildByName(nameOb); 
		if (target) {
			trace("DELETE OB                             " + nameOb);
			sprMain.removeChild(target);
			target = null;
		}
}
в проекте создаются иногда объеты, таким способом:
Код AS3:
var pPic:PagePicture = new PagePicture();
	pPic.name = "pPic";
	sprMain.addChild(pPic);
а потом вот так удаляются:
Код AS3:
deleteOb("pPic");
Будет ли это правильным так удалять и расскажите как Вы удаляете динмически созданные объекты? (ищу утечку памяти при загрузке внешних файлов)

Спасибо!!!!

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

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Код AS3:
removeChild( pPic );
pPic = null;
А дальше дело за сборщиком мусора.

Зачем удалять по свойству name, если можно по прямой ссылке?
__________________
hauts.ru

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

Регистрация: May 2009
Сообщений: 134
Цитата:
Сообщение от Hauts Посмотреть сообщение
Код AS3:
removeChild( pPic );
pPic = null;
А дальше дело за сборщиком мусора.

Зачем удалять по свойству name, если можно по прямой ссылке?
не, ну у меня же в других функциях удаление, а т.к. объект создан динамически - по прямой ссылке ругается - нет его в области переменных класса..... или я не правильно понимаю

Добавлено через 31 минуту
Я тут вот что в мануле нашла:
Цитата:
Помните, что при присвоении объекту значения null он необязательно будет удален из памяти. Иногда функция сборки мусора не выполняется, если доступный объем памяти не считается достаточно низким.
означает ли это, что если у меня друг за другом идут подгрузка 3-х swf то возможно памяти остается очень мало и становится только хуже.
Какой тогда выход?


Последний раз редактировалось kaetano; 19.05.2012 в 22:50.
Старый 20.05.2012, 00:09
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
не, ну у меня же в других функциях удаление, а т.к. объект создан динамически - по прямой ссылке ругается - нет его в области переменных класса..... или я не правильно понимаю
Цитата:
означает ли это, что если у меня друг за другом идут подгрузка 3-х swf то возможно памяти остается очень мало и становится только хуже.
Какой тогда выход?
Есть такой хороший принцип: "не понимаешь зачем - не делай". Не понимаете как удаляются объекты из памяти - не надо пытаться городить функции, которые их _якобы_ удаляют - просто к отсутствию результата добавится куча кода.
Иногда лучше чего-то не сделать и огрести (чтобы понять), чем полжизни копипастить "10 волшебных строчек", потому что так ваши деды и прадеды делали - а почему и зачем - никто не помнит.

А теперь без философии:
- на один и тот же объект может быть несколько ссылок с разных частей программы. Если вы одну занулите - это же не повод для флешплеера ломать работу всем остальным ссылающимся. Поэтому удаляет сборщик мусора, когда не ссылается никто
- pPic = null ничего не удаляет - оно просто убивает ссылку, и теперь на этот объект эта часть системы объект не держит в памяти - что делают другие части - это их проблемы.
- нахождение отбекта в списке отображение тоже считается ссылкой на него и мешает сборке (оно было бы странно, если бы объект исчезал с экрана без вызова removeChild, а просто так, потому что GC до него дополз)

Т.е. правила просты:
Есть часть системы - нужен объект - сохранеям ссылку - не нужен - убираем
Нужно убрать с экрана - убираем (это уже ресурсы экономит), нужно при этом ссылку оставить, чтобы потом его добавить - оставляем.
Ббольше не нужен части кода, но должен остаться на экране? - Просто занулите ссылку - кому надо удалят его с экрана.
И не морочим себе голову написанием чудо-функций "удалятелей" - это не C++.
Когда объект не будет никому требоваться - GC его сам удалит. А если он кому-то требуется - как его можно удалять?

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


Последний раз редактировалось expl; 20.05.2012 в 00:19.
Старый 20.05.2012, 00:38
kaetano вне форума Посмотреть профиль Отправить личное сообщение для kaetano Найти все сообщения от kaetano
  № 5  
Ответить с цитированием
kaetano
 
Аватар для kaetano

Регистрация: May 2009
Сообщений: 134
Цитата:
Сообщение от expl Посмотреть сообщение
И не морочим себе голову написанием чудо-функций "удалятелей" - это не C++.
Когда объект не будет никому требоваться - GC его сам удалит. А если он кому-то требуется - как его можно удалять?
т.е. если я правильно поняла - пишем как и выше советовали (мне надо освобождение ресурсов по-мах)
Код AS3:
removeChild( pPic );
pPic = null;
но тогда ошибка
Цитата:
Error #1065: Переменная pPic не определена.
как я понимаю оттого что pPic создан динамически в процессе, а потом мы его вдруг удаляем (например в слушателе события нажатия на кнопку "Закрыть"), программа не знает о таком объекте.

Добавлено через 17 минут
В общем я попробовала - создала глобальную переменную pPic. Удаляла ее как положено (т.е. со сцены и обнуление) и все равно загрузка прцессора та же(((

Старый 20.05.2012, 00:58
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Error #1065: Переменная pPic не определена.
Это значит что нет такого поля. И локальной переменной тоже нет такой.
В AS3 переменные/поля сами не создаются (ну разве что на динамических объектах можно создать) и за пределами функции недоступны
Это не "программа не знает об объекте", это "программа не знает такого поля", не то что объекта, который там должен был храниться.


Последний раз редактировалось expl; 20.05.2012 в 01:01.
Старый 20.05.2012, 01:11
kaetano вне форума Посмотреть профиль Отправить личное сообщение для kaetano Найти все сообщения от kaetano
  № 7  
Ответить с цитированием
kaetano
 
Аватар для kaetano

Регистрация: May 2009
Сообщений: 134
Цитата:
Сообщение от expl Посмотреть сообщение
Это значит что нет такого поля. И локальной переменной тоже нет такой.
В AS3 переменные/поля сами не создаются (ну разве что на динамических объектах можно создать) и за пределами функции недоступны
Это не "программа не знает об объекте", это "программа не знает такого поля", не то что объекта, который там должен был храниться.
Спасибо Вам, но я, видимо туповата. Не понимаю тогда как мне быть. Что такое "поле" не знаю.

И самое главное - даже при удалении со сцены и обнулении загрузка не уменьшилась. Задача то в этом.

Старый 20.05.2012, 02:49
kukareku вне форума Посмотреть профиль Отправить личное сообщение для kukareku Найти все сообщения от kukareku
  № 8  
Ответить с цитированием
kukareku

Регистрация: May 2012
Сообщений: 18
Цитата:
расскажите как Вы удаляете динмически созданные объекты? (ищу утечку памяти при загрузке внешних файлов)

Спасибо!!!!
Я заношу динамически создаваемые объекты в массив, и потом делaю
<найти этот объект в массиве>
removeChild(array[i]);
array[i]=null;
<удалить объект из массива>

Старый 20.05.2012, 15:23
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 9  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Спасибо Вам, но я, видимо туповата. Не понимаю тогда как мне быть. Что такое "поле" не знаю.

И самое главное - даже при удалении со сцены и обнулении загрузка не уменьшилась. Задача то в этом.
Вроде бы, такая терминология вполне используется (хотя чато методы обзывают функциями, а поля - переменными объекта/класса):
Код AS3:
private var _someField:SomeType;//Поле (field)
private var _x:int;// Поле (field)
private function get x():Number {return _x;}//                  \_  Свойство (Property)
private function set x(value:Number):Number { _x = value; }//   /
private function getX():Number { return _x; } // Метод (Method)
private function doSomething():void // Метод (Method)
{
    var x:int = 10;// Переменная(Variable)
}
Код AS3:
И самое главное - даже при удалении со сцены и обнулении загрузка не уменьшилась. Задача то в этом.
Загрузка чего? Процессора, которую в Диспетчере задач Windows смотрите? Или fps низкий?
Тогда давайте по-порядку:
- она вообще увеличивается при добавлении этого "спрайта"?
- он сам подписывается н внешние события, таймеры или ENTER_FRAME?
- что вообще есть в этом спрайте?
(кстати, GC может снести объект с работающим ENTER_FRAME, если на объект нет ссылок и он снесён со сцены, но ENTER_FRAME будет тикать всё время ожидания GC)


Последний раз редактировалось expl; 20.05.2012 в 15:29.
Старый 21.05.2012, 02:42
kaetano вне форума Посмотреть профиль Отправить личное сообщение для kaetano Найти все сообщения от kaetano
  № 10  
Ответить с цитированием
kaetano
 
Аватар для kaetano

Регистрация: May 2009
Сообщений: 134
Цитата:
Сообщение от expl Посмотреть сообщение
Загрузка чего? Процессора, которую в Диспетчере задач Windows смотрите? Или fps низкий?
Тогда давайте по-порядку:
- она вообще увеличивается при добавлении этого "спрайта"?
- он сам подписывается н внешние события, таймеры или ENTER_FRAME?
- что вообще есть в этом спрайте?
(кстати, GC может снести объект с работающим ENTER_FRAME, если на объект нет ссылок и он снесён со сцены, но ENTER_FRAME будет тикать всё время ожидания GC)
Да, загрузка увеличивается. у меня идет показ 3 подряд анимаций. ворзастает с 15 до 60 (во время показа), после первой анимации падает до 20 где-то, а после 3-й до 40.

да, сам спрайт подписывается, но это все вроде удаляется, уже проверяла.

вот тут подробнее про класс, если Вас не затруднит - посмотрите : http://www.flasher.ru/forum/showthread.php?t=179463

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

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

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


 


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


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