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

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

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

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
По умолчанию Удаление переменных мувиклипа

Всем привет.

При удалении мувиклипа - нужно обнулять его переменные (массивы в том числе) или достаточно removeChild и Object = null?

У меня почему-то разрастается память, которую использует флешка. Хотя, все объекты - удаляются и ничего вроде не должно оставаться.
Может быть причина в неудалении переменных мувиклипа?

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Удаление переменных и обнуление ссылок, присвоенных переменным - это совсем разные вещи.
Если в них хранятся картинки, то битмапдату этих картинок нужно так же уничтожать. То есть просто занулить ссылки будет недостаточно.
Так же нужно отписаться от всех событий и удалить объект из всех массивов. Ссылок на него не должно оставаться нигде.

Старый 13.07.2013, 16:44
ndiezel вне форума Посмотреть профиль Отправить личное сообщение для ndiezel Посетить домашнюю страницу ndiezel Найти все сообщения от ndiezel
  № 3  
Ответить с цитированием
ndiezel
 
Аватар для ndiezel

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
Допустим, у меня вот есть код удаления ракеты, если она вылетела за пределы боевого поля:
Код AS3:
				if (ship02Rockets[i].x<-50||ship02Rockets[i].x>820||ship02Rockets[i].y<-50||ship02Rockets[i].y>620)
				{
					warZone.removeChild(ship02Rockets[i]);
					ship02Rockets[i]=null;
					ship02Rockets.splice(i,1);
				}
Слушателей у неё нет, есть только ссылка в массиве ракет на этот мувик. Она удаляется, это не проблема.
Вот класс самой ракеты:
Код AS3:
package 
{
	import flash.display.*;
 
	public class Rocket_01 extends MovieClip
	{
		public var _speed:Number;
		public var _flame:Bitmap;
		public var _flame2:Bitmap;
 
		public function Rocket_01()
		{
		}
	}
}
В нём есть битмапы. Получается нужно удалять с помощью:
Код AS3:
			while (mc.numChildren)
			{
				mc.removeChildAt(0);
			}
?
И ещё и ship02Rockets[i].speed и другие переменные тоже принудительно удалять?

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Обнулять ссылки вообще не рекомендуется (в лучшем случае). Во-первых, после обнуления ссылок эти объекты все равно будут существовать в памяти пока до них не доберется сборщик мусора, а во-вторых, в вашем случае логичней всего было бы заново использовать эти объекты, которые вышли за рамки экрана. Создайте пул объектов и дергайте оттуда то, что вам нужно.
Стоит стараться использовать одни и те же объекты несколько раз вместо того, чтобы каждый раз создавать новые.

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

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Или можете использовать синглтоны

Старый 14.07.2013, 00:39
ndiezel вне форума Посмотреть профиль Отправить личное сообщение для ndiezel Посетить домашнюю страницу ndiezel Найти все сообщения от ndiezel
  № 6  
Ответить с цитированием
ndiezel
 
Аватар для ndiezel

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
Цитата:
Сообщение от Babylon Посмотреть сообщение
Или можете использовать синглтоны
Я смутно понял что это такое, ещё менее понятно для меня на кой оно мне тут надо?..

Опытным путём было выяснено что обнулять переменные в удаляемом мувике - нет смысла, они итак удаляются.
Но что-то всё же остаётся.
И это "что-то" - тяжело найти. Я уже начал битмапдаты записывать в массив, чтоб при удалении мувика делать dispose битмапдате в нём.
Вроде чуть лучше стало работать приложение. Но где-то всё равно дыры ещё есть

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

Регистрация: Feb 2012
Сообщений: 1,540
Сделай на сцене кнопку, повешай на нее System.gc(). Запусти дебаг режим и проверь, связана ли нагрузка с удалением ссылок.

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
http://help.adobe.com/ru_RU/as3/mobi...ng_content.pdf
Вот здесь во второй главе подробно описано про оптимизацию работы с памятью

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

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
Проблема решилась другим способом.
Когда заканчивалась игра - всё на экране замирало (все функции по созданию объектов, перемещению и проверки на столкновения не работали). Герой в это время взрывается (идёт цикл взрывов) и экран улетет и идёт очистка сцены с помощью:
Код AS3:
while (workScreen[0].numChildren)
{
	workScreen[0].removeChildAt(0);
}
Ну, там все слушатели удаляются предварительно, всё вроде как должно быть удалено.

Так вот.
Почему-то gc не удалял из памяти всю эту прелесть. Как заканчивал я игру в уровне с занятой памятью в 90Мб, так новый уровень с 90Мб и начинался. А закончив этот - занятая память разрасталась до 110 (допустим) и т.д.

Решил задачу тем, что продолжил движение объектов на сцене после смерти героя. Только включив условие их уничтожения (различными способами), пока он взрывается.
В результате, когда запускался код с циклом while - объектов на сцене уже почти не оставалось и gc (почему-то только теперь!) теперь действительно удалял всё, что было нужно удалить, а не оставлял это преспокойно в памяти.

Вот, как-то так.
Мда...

Добавлено через 2 часа 3 минуты
Ссылка на мувик, оставшаяся в массиве - может помешать gc удалить этот мувик?

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Если на массив есть ссылка, а в массиве есть мувик, то он (мувик) не удалится
http://www.adobe.com/devnet/actionsc...ollection.html вот тут больше про механизмы работы GC
http://www.skinkers.com/2010/10/08/m...ge-collection/ тут практические примеры эффективного удаления объектов
и самая веселая статья:
Motherfucking AS3 Garbage Collection
которая описывает вашу ситуацию, только в большем масштабе)

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

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

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


 


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


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