DisplayObjectContainer.removeAllChildren()
Я практично впевнений, що Ви хоч раз шукали метод removeAllChildren() у DisplayObjectContainer
Ось, на мою думку, найелегантніша реалізація (підказали Адобовці):
- public function removeAllChildren():void
- {
- while (numChildren > 0)
- removeChildAt(0);
- while (numChildren > 0)
- }
Квітень 16, 2008 в 18:55
ну да, это мой первый способ вычищения всех чайлдов из опредеоенной области ))
кстати такой тоже неплох))
public function removeAllChildren() : void {
while (this.numChildren) this.removeChildAt(0);
}
Травень 7, 2008 в 12:35
Я не уверен насчет реализации чайлдов, но ИМХО может удалять лучше с конца? Если это массив, то выкидывать каждый раз первый элемент не слишком оптимальное решение…
Травень 7, 2008 в 14:17
Пробачте, але я не бачу проблеми у видаленні с початку а не з кінця. Можете пояснити?
Травень 14, 2008 в 22:46
Для того чтобы удалить из массива не последний элемент - прийдется сдвинуть все стоящие за ним. 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 в 11:36
“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 в 11:50
Чудово


Дякую, друже!
Іще одне на вуса намотнув, що це не тільки рішення з меншою кількістю програмних символів, а ще й швидкісніше