DisplayObjectContainer.removeAllChildren()
Я практически уверен, что Вы хоть раз искали метод removeAllChildren() в DisplayObjectContainer :)
Вот, по-моему, самая элегантная реализация (подсказали Адобовцы):
public function removeAllChildren():void
{
while (numChildren > 0)
removeChildAt(0);
}
16, 2008 в %I:%M %p
ну да, это мой первый способ вычищения всех чайлдов из опредеоенной области ))
кстати такой тоже неплох))
public function removeAllChildren() : void {
while (this.numChildren) this.removeChildAt(0);
}
7, 2008 в %I:%M %p
Я не уверен насчет реализации чайлдов, но ИМХО может удалять лучше с конца? Если это массив, то выкидывать каждый раз первый элемент не слишком оптимальное решение…
7, 2008 в %I:%M %p
Пробачте, але я не бачу проблеми у видаленні с початку а не з кінця. Можете пояснити?
14, 2008 в %I:%M %p
Для того чтобы удалить из массива не последний элемент – прийдется сдвинуть все стоящие за ним. shift() работает медленней чем pop(), видимо по этой причине.
var a : Array = new Array();
for (var i : int = 0; i < 40000; i++) {
a.push(“node” + i);
}
function estimateRemoveAll1() : int {
var t : uint = flash.utils.getTimer();
while (a.length) a.shift();
return flash.utils.getTimer() – t;
}
function estimateRemoveAll2() : int {
var t : uint = flash.utils.getTimer();
while (a.length) a.pop();
return flash.utils.getTimer() – t;
}
trace (estimateRemoveAll1());
for (i = 0; i < 40000; i++) {
a.push(“node” + i);
}
trace (estimateRemoveAll2());
Но вот для чайлдов получается все с точностью наоборот :).. Видимо там все же не массив. У меня получилось, что удалять с конца примерно в 2 раза дороже чем выкидывать нулевой элемент. Возможно чайлды содержатся в памяти как односвязный список и для того чтобы найти последний, приходится пробежаться по всей очереди…
for (var j : int = 0; j < 1000; j++) {
addChild(new Sprite());
}
function estimateRemoveAll3() : int {
var t : uint = flash.utils.getTimer();
for (var k:int = 0; k < 100000; k++) {
getChildAt(0);
}
return flash.utils.getTimer() – t;
}
function estimateRemoveAll4() : int {
var tt : uint = flash.utils.getTimer();
for (var k:int = 0; k < 100000; k++) {
getChildAt(numChildren – 1);
}
return flash.utils.getTimer() – tt;
}
trace (estimateRemoveAll3());
trace (estimateRemoveAll4());
22, 2008 в %I:%M %p
“Essential ActionScript 3.0″ (Chapter 20, section Removing All Children):
“It [the top-to-bottom approach] should be avoided because it is slower than the preceding approach of removing children from the bottom up”
The top-to-bottom approach:
while(theParent.numChildren >0){
theParent.removeChildAt(theParent.numChildren-1);
}
The bottom-to-top approach:
while(theParent.numChildren >0){
theParent.removeChildAt(0);
}
22, 2008 в %I:%M %p
Чудово :)
Дякую, друже! :)
Іще одне на вуса намотнув, що це не тільки рішення з меншою кількістю програмних символів, а ще й швидкісніше :)