Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Удаление переменных мувиклипа (http://www.flasher.ru/forum/showthread.php?t=202393)

ndiezel 12.07.2013 23:24

Удаление переменных мувиклипа
 
Всем привет.

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

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

caseyryan 12.07.2013 23:48

Удаление переменных и обнуление ссылок, присвоенных переменным - это совсем разные вещи.
Если в них хранятся картинки, то битмапдату этих картинок нужно так же уничтожать. То есть просто занулить ссылки будет недостаточно.
Так же нужно отписаться от всех событий и удалить объект из всех массивов. Ссылок на него не должно оставаться нигде.

ndiezel 13.07.2013 16:44

Допустим, у меня вот есть код удаления ракеты, если она вылетела за пределы боевого поля:
Код 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 и другие переменные тоже принудительно удалять?

KumoKairo 13.07.2013 17:09

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

Babylon 13.07.2013 22:14

Или можете использовать синглтоны

ndiezel 14.07.2013 00:39

Цитата:

Сообщение от Babylon (Сообщение 1141015)
Или можете использовать синглтоны

Я смутно понял что это такое, ещё менее понятно для меня на кой оно мне тут надо?..

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

MikroAcse 14.07.2013 12:36

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

KumoKairo 14.07.2013 14:41

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

ndiezel 14.07.2013 18:13

Проблема решилась другим способом.
Когда заканчивалась игра - всё на экране замирало (все функции по созданию объектов, перемещению и проверки на столкновения не работали). Герой в это время взрывается (идёт цикл взрывов) и экран улетет и идёт очистка сцены с помощью:
Код AS3:

while (workScreen[0].numChildren)
{
        workScreen[0].removeChildAt(0);
}

Ну, там все слушатели удаляются предварительно, всё вроде как должно быть удалено.

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

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

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

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

KumoKairo 14.07.2013 20:56

Если на массив есть ссылка, а в массиве есть мувик, то он (мувик) не удалится
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, время: 17:01.

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