DisplayObjectContainer.removeAllChildren()

Я практично впевнений, що Ви хоч раз шукали метод removeAllChildren() у DisplayObjectContainer :)

Ось, на мою думку, найелегантніша реалізація (підказали Адобовці):

  1. public function removeAllChildren():void
  2. {
    1. while (numChildren > 0)
      1. removeChildAt(0);
  3. }

Таґи:

Коментарів: 6 to “DisplayObjectContainer.removeAllChildren()”

  1. dimpiax:

    ну да, это мой первый способ вычищения всех чайлдов из опредеоенной области ))
    кстати такой тоже неплох))

    public function removeAllChildren() : void {
    while (this.numChildren) this.removeChildAt(0);
    }

  2. chudesno:

    Я не уверен насчет реализации чайлдов, но ИМХО может удалять лучше с конца? Если это массив, то выкидывать каждый раз первый элемент не слишком оптимальное решение…

  3. Pirrest:

    Пробачте, але я не бачу проблеми у видаленні с початку а не з кінця. Можете пояснити?

  4. chudesno:

    Для того чтобы удалить из массива не последний элемент - прийдется сдвинуть все стоящие за ним. 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());

  5. chudesno:

    “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);
    }

  6. pirrest:

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

Залиште свій коментар