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

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

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

Регистрация: Aug 2012
Сообщений: 297
По умолчанию Остаётся ли объект после его удаления

Здравствуйте. Подскажи, пожалуйста. Есть код:
Код AS3:
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.events.Event;
 
//Определяю форму для рисования:
var shape:Shape;
//Определяю массив для квадратов:
var arrayRect:Array = [];
function mouseDown(event:MouseEvent):void
{
	//Устанавливаю "форму для рисования":
	shape = new Shape();
	//Определяю толщину и цвет линий у квадрата:
	shape.graphics.lineStyle(0,0x000000);
	//Начинаю заливку и изменяю цвет прозрачности:
	shape.graphics.beginFill(0x0+Math.random() * 99999,1);
	//Придаю "форме для рисования" форму квадрата (задаю координаты y и x аналогичные y и x курсора мыши, с шириной и высотой равной 50):
	shape.graphics.drawRect(mouseX - 25,mouseY - 25,50,50);
	//Прекращаю заливку:
	shape.graphics.endFill();
	//Добавляю созданный объект в массив:
	arrayRect.push(shape);
	//Добавляю созданный объект на сцену:
	stage.addChild(shape);
}
//Определяю событие обновления кадров:
stage.addEventListener(Event.ENTER_FRAME, updateFrames);
function updateFrames(event:Event):void
{
	//Если массив с квадратами больше 10, то:
	if(arrayRect.length > 10)
	{
		//Удалаяю событие нажатия кнопки (левой) мыши со сцены:
		stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
		//Вызываю функцию обрабатывающую массив с квадратами:
		workArrayRect();
	}
	else
	{
		//Определяю событие нажатия кнопки (левой) мыши на сцену:
		stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
	}
}
//Определяю функцию с циклом, который обрабатывает массив с квадратами:
function workArrayRect()
{
	//Объявляю цикл:
	for(var i:Number = 0; i < arrayRect.length; i++)
	{
		//Вызываю функцию, который производит работу с объектами из массива:
		manipulationArrayRect(arrayRect[i],i);
	}
}
//Определяю функцию производящую работу с объектами из массива:
function manipulationArrayRect(argument,i)
{
	//Если на сцене есть объект, то:
	if(stage.contains(argument))
	{
		//Удаляю его со сцены:
		stage.removeChild(argument);
	}
	else
	{
		//Удаляю элементы массив от нуля до числа, которое равно длине массива:
		arrayRect.splice(0,arrayRect.length);
	}
}
Он удаляет объекты со сцены, потом очищает массив с объектами. Куда деваются эти объекты? Возможно ли такое, что после миллиона добавленных и удалённых объектов, приложение начало тормозить, так как эти объекты всё-таки где-то остались? Как этого можно избежать? Как можно полностью удалить объект?

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

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 613
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Удалится только первый шейп со сцены. Первый раз выполнится функция manipulationArrayRect, которая обнулит массив. И цикл который по задумке должен был обойти все элементы массива после этого завершится

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

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от Rzer Посмотреть сообщение
Удалится только первый шейп со сцены. Первый раз выполнится функция manipulationArrayRect, которая обнулит массив. И цикл который по задумке должен был обойти все элементы массива после этого завершится
Спасибо за помощь.
У меня удаляются все объекты со сцены и очищается массив. Но я исправил.

Код AS3:
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.events.Event;
 
//Определяю форму для рисования:
var shape:Shape;
//Определяю массив для квадратов:
var arrayRect:Array = [];
//Переменная для хранения количества удалённых объектов:
var numberRemoteObjects:int = 0;
function mouseDown(event:MouseEvent):void
{
	//Устанавливаю "форму для рисования":
	shape = new Shape();
	//Определяю толщину и цвет линий у квадрата:
	shape.graphics.lineStyle(0,0x000000);
	//Начинаю заливку и изменяю цвет прозрачности:
	shape.graphics.beginFill(0x0+Math.random() * 99999,1);
	//Придаю "форме для рисования" форму квадрата (задаю координаты y и x аналогичные y и x курсора мыши, с шириной и высотой равной 50):
	shape.graphics.drawRect(mouseX - 25,mouseY - 25,50,50);
	//Прекращаю заливку:
	shape.graphics.endFill();
	//Присваиваю объекту имя:
	shape.name = 'Shape'+String(arrayRect.length);
	//Добавляю созданный объект в массив:
	arrayRect.push(shape);
	//Добавляю созданный объект на сцену:
	stage.addChild(shape);
}
//Определяю событие обновления кадров:
stage.addEventListener(Event.ENTER_FRAME, updateFrames);
function updateFrames(event:Event):void
{
	//Если массив с квадратами больше 9, то:
	if(arrayRect.length > 9)
	{
		//Удалаяю событие нажатия кнопки (левой) мыши со сцены:
		stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
		//Вызываю функцию обрабатывающую массив с квадратами:
		workArrayRect();
	}
	else
	{
		//Определяю событие нажатия кнопки (левой) мыши на сцену:
		stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
	}
}
//Определяю функцию с циклом, который обрабатывает массив с квадратами:
function workArrayRect()
{
	//Объявляю цикл:
	for(var i:Number = 0; i < arrayRect.length; i++)
	{
		//Вызываю функцию, который производит работу с объектами из массива:
		manipulationArrayRect(arrayRect[i],i);
	}
}
//Определяю функцию производящую работу с объектами из массива:
function manipulationArrayRect(argument,i)
{
	//Если на сцене есть объект, то:
	if(stage.contains(argument))
	{
		//Увеличиваю значение переменной на 1:
		numberRemoteObjects += 1;
		//Удаляю его со сцены:
		stage.removeChild(argument);
	}
	//Если сумма удалённых объектов равна длине массива с объектами, то:
	else if(numberRemoteObjects == arrayRect.length)
	{
		//Удаляю элементы массив от нуля до числа, которое равно длине массива:
		arrayRect.splice(0,arrayRect.length);
		//Изменяю значение переменной, которая хранит число удалённых объектов, на 0:
		numberRemoteObjects = 0;
	}
}
Но некоторые вопросы всё ещё актуальны: куда после "удаления со сцены и очистки массива" деваются объекты? Что с ними происходит? Может быть они где-то висят и нагружают "память" приложения, что в будущем (после миллиона удалённых объектов) приложение начнёт тормозить? Как это исправить, если это будет?

Старый 01.12.2012, 21:34
Frost47rus вне форума Посмотреть профиль Отправить личное сообщение для Frost47rus Найти все сообщения от Frost47rus
  № 4  
Ответить с цитированием
Frost47rus
[+4 08.09.13]

Регистрация: May 2012
Сообщений: 131
если нужный вам элемент является экземпляром класса с заполненными полями - вызовите у него (предварительно создав) - метод самоочистки, в котором удалите все связи(листенеры/ссылки и т.д.) и занулите переменные. после этого смело зануляйте ссылку на сам элемент.
дальше останется только ждать великого GC.

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

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от Frost47rus Посмотреть сообщение
если нужный вам элемент является экземпляром класса с заполненными полями - вызовите у него (предварительно создав) - метод самоочистки, в котором удалите все связи(листенеры/ссылки и т.д.) и занулите переменные. после этого смело зануляйте ссылку на сам элемент.
дальше останется только ждать великого GC.
Спасибо. А что такое GC?

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
А что такое GC?
garbage collector или сборщик мусора

Старый 20.01.2013, 20:19
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 7  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Dip52 Посмотреть сообщение
Остаётся ли объект после его удаления
Нет, такой объект удаляется безвозвратно.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

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

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


 


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


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