Форум 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=195432)

iiiusion 07.03.2013 00:14

Вопрос по "длинным массивам"
 
Доброе время суток.
Ситуация следующая:
Создаю вектор из 100000 графических элементов, при этом не добавляю эти элементы на сцену. Памяти на это ушло порядка 300Mb. Операций ни каких с этим вектором не провожу, но fps падает в два раза. Что за дела?) Кто-нибудь может прояснить причину падения fps? Понятно что мне не нужно столько элементов), вопрос скорее теоретически-гипотетический)
Спасибо.


Код AS3:

public var Enemy01Arr:Vector.<Enemy01> = new Vector.<Enemy01>;
 
public function PObject(gameplay_:GamePlay)
{
        _gameplay = gameplay_;
 
        for (var value01:int = 0; value01 < 100000; value01 ++)
      {
                var _Enemy01:Enemy01 = new Enemy01();
                Enemy01PoolArr.push(_Enemy01);
        }
}


mikhailk 07.03.2013 00:34

Enemy01 - часом не мувики, в которых крутится анимация? Что там внутри?

KumoKairo 07.03.2013 00:47

Может кстати в конструкторе Enemy01 сслыка на какие- нибудь циклические функции, которые выполняются в фоновом режиме.
Поддерживая mikhailk попрошу скинуть код (хотя бы конструктор) класса Enemy01)

iiiusion 07.03.2013 00:50

Сеперкласс Sprite, внутри действительно есть несколько MovieClip, но анимации там нет. Пробовал создать вектор из 1000000 Sprite без отрисованной графики в конструкторе, заняло 800mb. Тормозов нет.

вот то что в конструкторе
Код AS3:

public class Enemy01 extends EnemiesSC
        {
                public var _gameplay:GamePlay
                public var _Child:Enemy01MC = new Enemy01MC();
 
                public function Enemy01()
                {
                        //_gameplay = gameplay_;
                        addChild (_Child);
                        _Child.bodyHT.visible = false;
 
 
                }


KumoKairo 07.03.2013 00:56

свойство .visible = false не освобождает процессор от отрисовки объектов, внутри программы они все еще продолжают жить и работать, со всеми вытекающими в виде падения fps.
Обычно делают функции initialize() и dispose() в которых добавляют или удаляют нужные объекты с экрана

проблема начинается со строчки
Код AS3:

addChild (_Child);


iiiusion 07.03.2013 01:05

не я не пойму)

коменчу:
Код AS3:

addChild (_Child);
_Child.bodyHT.visible = false;

- тормозит

коменчу:
Код AS3:

public var _Child:Enemy01MC = new Enemy01MC();

- всё гладко(правда при этом не 300mb уходит а 170Mb, хотя как показывают эксперименты - объём не вляет на fps)

mikhailk 07.03.2013 01:06

Цитата:

внутри действительно есть несколько MovieClip, но анимации там нет.
Она явно остановлена?

Меня в свое время замучили мувиками с непредсказуемой анимацией внутри. Поэтому в любых мувиках, которые мне готовили другие флешеры, перед использованием я останавливал анимацию вот таким грубоватым способом:

Код AS3:

public static function stopAllAnimationInContainer(container:DisplayObjectContainer) : void
{
 
        if (!container) return;
 
        if (container as MovieClip) (container as MovieClip).stop();
 
        if (container.numChildren > 0)
        {
                for (var i:int = 0; i < container.numChildren; i++)
                {
                        var child:DisplayObjectContainer = container.getChildAt(i) as DisplayObjectContainer;
                        if (child) stopAllAnimationInContainer(child);
 
                }
        }               
}

Использовал, соответственно, так (ServiceFunctions - класс со служебными функциями):

Код AS3:

var anyMC:AnyMC = new AnyMC(); 
ServiceFunctions.stopAllAnimationInContainer(anyMC);
addChild(anyMC);


in4core 07.03.2013 01:07

Оффтоп. - блин ну не пользуйтесь вы public var ! это ужасно

iiiusion 07.03.2013 01:30

в общем прописал stop() для мувика, удалил всю графику из него(чистый мувиклип), удалил единственный кадр из него.
та же ерунда. тормоза изчезают только когда убираю "= new Enemy01MC()". дела)

mikhailk 07.03.2013 09:27

А если

Код AS3:

var _Enemy01:Enemy01 = new Enemy01();

заменить на

Код AS3:

var _Enemy01:Sprite = new Sprite();

тормоза остаются?

А если на

Код AS3:

var _Enemy01:MovieClip= new MovieClip();

?

Добавлено через 2 часа 0 минут
В общем, Вы что-то не так делаете.
Провел испытания:

1. Кидаем в массив 100000 спрайтов - на FPS никак не сказывается и грузится мгновенно
2. Кидаем в массив 100000 мувиков с анимацией (я кидал микропрелоадер "крутящееся колесико") - грузится долго и FPS падает катастрофически
3. Кидаем в массив 100000 тех же мувиков, но с остановкой анимации - грузится долго, но на FPS не влияет

Думаю, Вы просто не остановили анимацию.


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

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