PDA

Просмотр полной версии : Как гарантировано удалить мувиклип?


darkvam
10.09.2008, 08:06
история такая. ролик сильно тормозит. Но все создаваемые мувики тщательно отслеживаю и удаляю removeMovieClip(). счётчик мувиков показывает, что мувиков в сцене не больше 40, однако через несколько минут игры ролик начинает просто ужасно тормозить. Я уже все пути испробывал. есть ли более надёжный способ удалить мувик?

darksranger
10.09.2008, 08:23
поиск-утечка памяти

darkvam
10.09.2008, 12:37
было уже. я искал - никак не относиться к моей проблемме. ничего не помогает.

qazwsx
10.09.2008, 12:54
У тебя почти наверника мувики заносятся в массив. Ты удаляеш мувиклип а массив в итоге все ростет и ростет, а ты делаеш сравнение по всем элементам массива... Ну или что небудь вроде этого). Ищи утечки

darkvam
10.09.2008, 15:17
qazwsx
точно так наверное и есть((( а как можно избавиться? удалять значение ещё и из массива?

Division
10.09.2008, 15:40
удалять значение ещё и из массива
Ну да, а как ещё? (:

Obi
10.09.2008, 16:10
mc.removeMovieCLip();
delete mc;

Сборщик мусора удаляет объект из памяти только когда никто на него больше не ссылается, по этому нужно удалять все ссылки на объект.

darkvam
10.09.2008, 16:19
Division
скажи пожалуйста как именно, ибо метод shift() похоже не действует - array._leight не уменьшается((

Division
10.09.2008, 16:31
Ну значит самый простой для понимания способ:
Допустим у тебя нужно удалить i-й элемент массива arr.
Делаешь так:

arr[i]=arr[arr.length-1];
arr.pop();

darkvam
11.09.2008, 08:34
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 что-то я не въехал что тебе нужно (: