PDA

Просмотр полной версии : Вопрос по "длинным массивам"


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



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. Тормозов нет.

вот то что в конструкторе
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() в которых добавляют или удаляют нужные объекты с экрана

проблема начинается со строчки addChild (_Child);

iiiusion
07.03.2013, 01:05
не я не пойму)

коменчу:
addChild (_Child);
_Child.bodyHT.visible = false;
- тормозит

коменчу:
public var _Child:Enemy01MC = new Enemy01MC();
- всё гладко(правда при этом не 300mb уходит а 170Mb, хотя как показывают эксперименты - объём не вляет на fps)

mikhailk
07.03.2013, 01:06
внутри действительно есть несколько MovieClip, но анимации там нет.

Она явно остановлена?

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


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 - класс со служебными функциями):


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
А если

var _Enemy01:Enemy01 = new Enemy01();

заменить на

var _Enemy01:Sprite = new Sprite();

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

А если на

var _Enemy01:MovieClip= new MovieClip();

?

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

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

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