Просмотр полной версии : Как гарантировано удалить мувиклип?
история такая. ролик сильно тормозит. Но все создаваемые мувики тщательно отслеживаю и удаляю removeMovieClip(). счётчик мувиков показывает, что мувиков в сцене не больше 40, однако через несколько минут игры ролик начинает просто ужасно тормозить. Я уже все пути испробывал. есть ли более надёжный способ удалить мувик?
darksranger
10.09.2008, 08:23
поиск-утечка памяти
было уже. я искал - никак не относиться к моей проблемме. ничего не помогает.
У тебя почти наверника мувики заносятся в массив. Ты удаляеш мувиклип а массив в итоге все ростет и ростет, а ты делаеш сравнение по всем элементам массива... Ну или что небудь вроде этого). Ищи утечки
qazwsx
точно так наверное и есть((( а как можно избавиться? удалять значение ещё и из массива?
Division
10.09.2008, 15:40
удалять значение ещё и из массива
Ну да, а как ещё? (:
mc.removeMovieCLip();
delete mc;
Сборщик мусора удаляет объект из памяти только когда никто на него больше не ссылается, по этому нужно удалять все ссылки на объект.
Division
скажи пожалуйста как именно, ибо метод shift() похоже не действует - array._leight не уменьшается((
Division
10.09.2008, 16:31
Ну значит самый простой для понимания способ:
Допустим у тебя нужно удалить i-й элемент массива arr.
Делаешь так:
arr[i]=arr[arr.length-1];
arr.pop();
Division
при этом, если в коде есть функция типа:
for (var a = 0; a<Arraster.length; a++) {
Arraster[a]._y += 3;
if (Arraster[a]._y>=210) {
points -= 20;
_root.panel.pointsnum.text = points;
_root.panel.pointsnum.replaceText();
Arraster[a].unloadMovie();
Arraster[a].removeMovieClip();
Arraster[a].pop();
}
}
то в этом случае получается, что points -= 20; будет работать каждый кадр, тоесть массив будет считать Arraster[a] предыдущий за удалённым из массива элемент. тоесть получается нескончаемый цикл. мне же нужно чтобы points -= 20; было одинарным действием которое происходит после положительного ответа на ХитТест. почему появляется такая проблемма?
Division
11.09.2008, 10:37
Если честно, я ничего не понял (:
Но вот что могу сказать - нужно цикл сделать от большего к меньшему.
Я бы написал примерно так:
for (var a = Arraster.length-1; a>=0; a--) {
Arraster[a]._y += 3;
if (Arraster[a]._y>=210) {
points -= 20;
_root.panel.pointsnum.text = points;
_root.panel.pointsnum.replaceText();
Arraster[a].unloadMovie();
Arraster[a].removeMovieClip();
Arraster[a] = Arraster[Arraster.length-1];
Arraster[a].pop();
}
}
А про points что-то я не въехал что тебе нужно (:
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.