PDA

Просмотр полной версии : Нужно ли и как удалять созданные фильтры?


windrunner31
18.01.2012, 10:29
Создаю фильтр вот так:
_sprite.filters = [new GlowFilter(16711680,50,20,20,3,3)];
Пока что,когда я хочу убрать фильтр я делаю так:
sprite.filters = [];
Правильно ли это?Или все же фильтр - обьект и подлежит удалению как-то по другому?

Wolsh
18.01.2012, 11:25
Если создаете именно таким способом, не создавая переменную класса для хранения ссылки на фильтр, то это нормальное удаление – ссылка, хранящаяся в массиве filters, будет удалена и экземпляр фильтра будет удален GC в надлежащее время. Если же сохранять фильтр в переменную, то достаточно необходимо и ее тоже обнулить, когда фильтр больше не нужен.

BuKT
18.01.2012, 11:45
Вопрос в тему. Будет ли ошибка?
_sprite.filters = [null, undefined, null]
Выполнится ли фильтр?
_sprite.filters = [null, new BlurFilter(2,2,3), null]
И где можно почитать про воркфлоу фильтров?

goodguy
18.01.2012, 11:57
Если же сохранять фильтр в переменную, то достаточно ее обнулить, когда фильтр больше не нужен.
Она ведь будет храниться в массиве фильтров. Оттуда тоже нужно будет снести

HardCoder
18.01.2012, 12:27
Она ведь будет храниться в массиве фильтров. Оттуда тоже нужно будет снестиА почему она будет там хранится? Я всегда думал, что:var a:Object = new Object();
var b:Object = {c:a};
trace(b.c); //Object
a = null;
trace(b.c); //null

goodguy
18.01.2012, 12:35
Ну, индекс элемента в массиве - это такая же ссылка. Приравнивание ссылки на объект к null в одном месте, не уничтожает сам объект. А раз уж ссылка на него есть еще и в массиве, то сборщик мусора его так же не уничтожит.

var array:Array = [];
var sprite:Sprite = new Sprite();
array.push(sprite);
sprite = null;
trace(array[0]); // [object Sprite]

И в твоем случае null там не будет. Только что проверил.
Все будет так:

var a:Object = new Object();
var b:Object = {c:a};
a = null;
trace(b.c)// [object Object]

HardCoder
18.01.2012, 12:41
И в твоем случае null там не будет. Только что проверил.Вот, я нехороший человек! Даже поленился проверить :D. Спасибо за наставление. Совсем забыл про аксиому "нужно удалять все ссылки".

Wolsh
18.01.2012, 13:30
Она ведь будет храниться в массиве фильтров. Оттуда тоже нужно будет снестиКриво выразился, сорри. Подразумевалось естественно, что в случае с переменной обнулить массив недостаточно, надо обнулить и саму переменную. Но согласен, прозвучало так как будто обнулять массив не надо(((( мои извинения.

windrunner31
18.01.2012, 14:52
Спасибо всем!

expl
18.01.2012, 16:42
Создаю фильтр вот так:
_sprite.filters = [new GlowFilter(16711680,50,20,20,3,3)];
Пока что,когда я хочу убрать фильтр я делаю так:
sprite.filters = [];
Правильно ли это?Или все же фильтр - обьект и подлежит удалению как-то по другому?
Можно просто

sprite.filters = null;

Оно и проще и лишний массив не создается.

gloomyBrain
18.01.2012, 17:08
а еще оно выдает неведомые баги отображения. лучше заменять на пустой массив. Если не хочется создавать новый - можно вынуть из старого и присвоить старый (теперь уже пустой) заново.

var fiterArray:Array = myObject.filters;
fiterArray.length = 0;
myObject.filters = fiterArray;

goodguy
18.01.2012, 17:53
а еще оно выдает неведомые баги отображения
Какие?
Всегда так делаю, но впервые слышу о багах

gloomyBrain
18.01.2012, 18:39
Ну ты и сортировку всегда делал правильно. Баги в 10 плеере наблюдались, не знаю как в 11. Просто не удалялся фильтр, или оставалось что- то фильтрованным, а что-то нет (части отображения). Поэтому всегда присваиваю пустой массив вместо null.