![]() |
|
||||||||||
|
|
|
|||||
|
Всем привет.
При удалении мувиклипа - нужно обнулять его переменные (массивы в том числе) или достаточно removeChild и Object = null? У меня почему-то разрастается память, которую использует флешка. Хотя, все объекты - удаляются и ничего вроде не должно оставаться. Может быть причина в неудалении переменных мувиклипа? |
|
|||||
|
Удаление переменных и обнуление ссылок, присвоенных переменным - это совсем разные вещи.
Если в них хранятся картинки, то битмапдату этих картинок нужно так же уничтожать. То есть просто занулить ссылки будет недостаточно. Так же нужно отписаться от всех событий и удалить объект из всех массивов. Ссылок на него не должно оставаться нигде. |
|
|||||
|
Допустим, у меня вот есть код удаления ракеты, если она вылетела за пределы боевого поля:
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); } Вот класс самой ракеты: 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() { } } } ? И ещё и ship02Rockets[i].speed и другие переменные тоже принудительно удалять? |
|
|||||
|
Обнулять ссылки вообще не рекомендуется (в лучшем случае). Во-первых, после обнуления ссылок эти объекты все равно будут существовать в памяти пока до них не доберется сборщик мусора, а во-вторых, в вашем случае логичней всего было бы заново использовать эти объекты, которые вышли за рамки экрана. Создайте пул объектов и дергайте оттуда то, что вам нужно.
Стоит стараться использовать одни и те же объекты несколько раз вместо того, чтобы каждый раз создавать новые. |
|
|||||
|
Или можете использовать синглтоны
|
|
|||||
|
Я смутно понял что это такое, ещё менее понятно для меня на кой оно мне тут надо?..
Опытным путём было выяснено что обнулять переменные в удаляемом мувике - нет смысла, они итак удаляются. Но что-то всё же остаётся. И это "что-то" - тяжело найти. Я уже начал битмапдаты записывать в массив, чтоб при удалении мувика делать dispose битмапдате в нём. Вроде чуть лучше стало работать приложение. Но где-то всё равно дыры ещё есть ![]() |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
Сделай на сцене кнопку, повешай на нее System.gc(). Запусти дебаг режим и проверь, связана ли нагрузка с удалением ссылок.
|
|
|||||
|
http://help.adobe.com/ru_RU/as3/mobi...ng_content.pdf
Вот здесь во второй главе подробно описано про оптимизацию работы с памятью |
|
|||||
|
Проблема решилась другим способом.
Когда заканчивалась игра - всё на экране замирало (все функции по созданию объектов, перемещению и проверки на столкновения не работали). Герой в это время взрывается (идёт цикл взрывов) и экран улетет и идёт очистка сцены с помощью: Ну, там все слушатели удаляются предварительно, всё вроде как должно быть удалено. Так вот. Почему-то gc не удалял из памяти всю эту прелесть. Как заканчивал я игру в уровне с занятой памятью в 90Мб, так новый уровень с 90Мб и начинался. А закончив этот - занятая память разрасталась до 110 (допустим) и т.д. Решил задачу тем, что продолжил движение объектов на сцене после смерти героя. Только включив условие их уничтожения (различными способами), пока он взрывается. В результате, когда запускался код с циклом while - объектов на сцене уже почти не оставалось и gc (почему-то только теперь!) теперь действительно удалял всё, что было нужно удалить, а не оставлял это преспокойно в памяти. Вот, как-то так. Мда... Добавлено через 2 часа 3 минуты Ссылка на мувик, оставшаяся в массиве - может помешать gc удалить этот мувик? |
|
|||||
|
Если на массив есть ссылка, а в массиве есть мувик, то он (мувик) не удалится
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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|