20 ноября 2011

Утечка памяти в actionscript

Часто при создании больших проектов встает вопрос с тем, что во время работы приложения происходит утечка памяти (то есть с течением времени количество памяти которое необходимо для приложения постоянно растет).

Основной причиной утечки памяти является постоянное увеличения количества графических объектов, которые не удаляются, а напротив постоянно прибавляются. Это может быть вызвано тем, что что по каким-то событиям происходит создание и добавления элементов в область видимости. Это может быть вызвано некоторыми вещами:
1. Случайное создание объектов (недосмотр);
2. Если графика была создана с помощью flash cs, и графика располагалась на stage то эти объекты плодятся (как не парадоксально).

Самое элементарное что можно сделать это просто считать сколько графических объектов у нас лежит... 

// ставим прослушиватель на stage
stage.removeEventListener(Event.ENTER_FRAME, tick);
....
private var ticks:uint = 0;
private var tf:TextField = new TextField();
private var last:uint = getTimer();
  public function tick(evt:Event):void 
  {
    ticks++;
    var now:uint = getTimer();
    var delta:uint = now - last;
    if (delta >= 1000) 
    {
     var countObject:uint = countObjects(stage);
     tf.text = 'Count Object Display: '+ countObject;
     addChild(tf);// что бы было всегда выше всего на экране
     ticks = 0;
     last = now;
    }
  }
  
  //функция рекурсивная так что будет бежать и по детям детей
  private function countObjects(obj:DisplayObjectContainer):uint
  {
    if (!obj) return 0;
    var count:uint = 0;
    count += obj.numChildren;
    // бежим о всем детям
    for (var i:int = 0; i < obj.numChildren; i ++)
     count += countObjects(obj.getChildAt(i) as DisplayObjectContainer);
    return count;
  }

Теперь мы можем видеть растет ли количество, если да, то осталось посмотреть в коде откуда у нас утечка)))


Если есть предложения, то буду рад услышать ваши предложения...

10 комментариев:

  1. User referenced to your post from Утечка памяти в actionscript saying: [...] Оригинал взят у в Утечка памяти в actionscript [...]

    ОтветитьУдалить
  2. Полезная штука, надо будет опробовать.

    ОтветитьУдалить
  3. private var timer:Timer = new Timer(1000);

    public function Main() {
    timer.addEventListener(TimerEvent.TIMER, onTick);
    timer.start();
    }

    private function onTick(e:TimerEvent):void {
    var countObject:uint = countObjects(stage);
    tf.text = "" + countObject;
    setChildIndex(tf, numChildren - 1);
    }

    private function countObjects(obj:DisplayObjectContainer):uint {
    if (!obj) return 0;
    var count:uint = 0;
    count += obj.numChildren;
    for (var i:int = 0; i < obj.numChildren; ++i)
    count += countObjects(obj.getChildAt(i) as DisplayObjectContainer);
    return count;
    }
    - - - - -
    а в каких ситуациях плодятся объекты stage?
    интересно было бы смоделировать

    ОтветитьУдалить
  4. Я же писал, когда графика была создана, например во adobe flash cs, и лежит на экране вместо того чтобы хранится в библиотеке

    ОтветитьУдалить
  5. кидаю на сцену дин. текст, рисую круг и превращаю в мувик, рисую квадрат и оставляю так.
    Запускаю – всё время пишет 5 объектов.

    ОтветитьУдалить
  6. а теперь сделай где-нибудь 150 символов на стаге и повесь на них события, чтобы на них ссылки оставались

    ОтветитьУдалить
  7. да, попробуй и напиши о своих результатах, всем будет интересно

    ОтветитьУдалить
  8. ну вот
    посадил 160 мувиков
    каждый слушает ENTER_FRAME и плавно меняет альфу
    полдня висело и как было 322, так и осталось
    доктор, что я делаю не так?

    ОтветитьУдалить
  9. может адобовцы исправили этот баг, надо будет самому проверить

    ОтветитьУдалить

Поделиться своими мыслями...