Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Почему проц грузится? и память забивается? (http://www.flasher.ru/forum/showthread.php?t=149023)

smad 18.01.2011 07:29

Почему проц грузится? и память забивается?
 
Вложений: 1
Всем доброго времени суток
Написал небольшое приложение, но когда запускаю, со временем начинает память засорятся + процессор загружается, не могу понять причину, может надо было делать по другому?
Исходник во вложении...

bav 18.01.2011 10:44

Потому что у вас каждую секунду вызывается функция moveBlocks(e:TimerEvent), которая, в свою очередь, вызывает функцию PaintBl(), где черным по белому сказано:
Код AS3:

for(i=0; i<16; i++)
{
  for(j=0; j<13; j++)
  {
    _block1 = new block1();
    _block2 = new block2();
    if (...) addChild(_block1);
    else addChild(_block2);
  }
}

Т.е. вы ежесекундно добавляете в список отображения некоторое количество вновь созданных объектов. А так как вы их оттуда не удаляете, они продолжают висеть в памяти. Вот, к примеру, что выводит добавление строчки trace("numChildren: " + numChildren); в функции moveBlocks():
Код:

numChildren: 245
numChildren: 360
numChildren: 475
numChildren: 590
numChildren: 705
numChildren: 820
numChildren: 935
numChildren: 1050
numChildren: 1165
numChildren: 1280
numChildren: 1395
numChildren: 1510
numChildren: 1625

И все эти экземпляры block1 или block2, не подлежат удалению сборщиком мусора, потому что на них есть ссылка в списке отображения. Попробуйте где-нибудь, скажем в массиве, сохранять ссылки на блоки, создаваемые в функции PaintBl(), и в начале функции moveBlocks() удалять их методом removeChild().
И отучайтесь писать код в кадрах, пишите его в классах.

smad 18.01.2011 14:34

Понятно, спасибо большое, я думал с массивом что-то не то, вроде как все переписывается :)
Только вот пока как-то не особо представляю предложенный метод, как сделать ссылки?
ПиСи:Насчет классов ok =)

bav 18.01.2011 16:40

Вот, к примеру:
Код AS3:

// Создаем хранилище ссылок.
private var blocksToRemove:Array = [];
 
// В функцию PaintBl добавляем следующее
if (...)
{
  blocksToRemove.push(_block1); // сохраняем в массиве ссылку на наш клип
  addChild(_block1);
} // в блоке else делаем то же самое, только для _block2
 
// А в функции moveBlocks проходимся по элементам массива
// и удаляем их из списка отображения (Display list)
while (blocksToRemove.length)
{
  removeChild(blocksToRemove[0]); // в removeChild() передается ссылка на блок
  blocksToRemove.unshift(); // удаляем из массива элемент с индексом 0.
}

Я не вникал подробно в ваш код, поэтому могут быть некоторые несоответствия того, что я пытаюсь описать, с тем, что у вас получится. Но, надеюсь, идея ясна.

smad 19.01.2011 07:39

Спасибо, буду экспериментировать :)


Часовой пояс GMT +4, время: 07:03.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.