PDA

Просмотр полной версии : Клипы на сцене


Ruffus
27.06.2008, 22:22
У меня по логике пиложения существует вложенность клипов. В результате в одном из клипов этой иерархии создаётся большое количество маленьких клипов. Но по практике я вижу, что дело не в их сложности, а именно в количестве. Вопрос такой. Сколько клипов я могу расположить на сцене? Какие существуют ограничения на вложенность?

Alex_beginner
28.06.2008, 17:03
Здравствуйте Ruffus!

Собственно теоретически нет ограничений на глубину вложенности. Однако, если Вы создадите множество клипов с различными глубинами вложенности это может привести к преждевременному "коллапсу" и скоропостижной "смерти" FlashPlayer'а.:)

Ruffus
29.06.2008, 13:05
У меня, естественно, у всех клипов различная глубина. Чем дальше, тем выше. Но вложенности там запредельной нет, уровня 3-4. Фишка в том, что когда на соотв-м уровне количество клипов около тысячи, флэш подвисает, подом выдаёт сообщение с вопросом об аборте загрузки мувика.

iNils
29.06.2008, 13:16
количество клипов около тысячиДля as1/as2 это слишком много. Создавайте не за раз, а в течении какого то времени (по 100-200 за один кадр). А теоретически можно создать 1064960 клипов в каждом клипе.

Ruffus
29.06.2008, 16:43
То есть это слишком большая нагрузка на кадр? Предлагаете по мере создания клипов переключаться на следующие кадры?

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

Psycho Tiger
30.06.2008, 14:20
То есть это слишком большая нагрузка на кадр? Предлагаете по мере создания клипов переключаться на следующие кадры?
Нет никакой нагрузки на кадр. Поясню:

i=100000;
while (i--){ }

Флэш пока не выолнит этот скрипт - ничего делать не будет. Но выполнение может идти слишком долго - и пользователю предлагают убить этот скрипт.
Если создавать их через временной интервал - то он создат быстренько 100 мувиков, передохнет чуток, снова сделает - снова передохнет. Есть отдых - значит он не завис, и скрипт убивать не нужно.
я создал в мувике десять пустых кадров, переключаю их по мере создания кучи клипов. Проблема не решилась, только неприятные эффекты появились вроде перемигивания самого мувика.
INils имел ввиду создавать их через onEnterFrame, как я понял
То есть

i=0;
onEnterFrame=function(){
createMyMovieClips(from i to i+100);
i+=100;
if (i>=toBig) delete onEnterFrame;
}

Но я бы сделал это через setInterval, имхо лучше.

ЗЫ извиняюсь за отсуствие типизации, ибо все равно код никому не нужный - показан чисто для примера.

iNils
30.06.2008, 17:06
Но я бы сделал это через setInterval, имхо лучше.Это миф.

Alex_beginner
30.06.2008, 17:11
Ruffus! Тут нужно понять, что на Выполнение кода кадра отводится 15 секунд, апосля Флеш выдает предупреждающее сообщение о том, что код тормозит выполнение приложения и предлагает выбор - продолжить выполнение скрипта или нет.

Для решения этой проблемы есть два пути. Первый вариант - создать 3 кадра, т.е. цикл в трех кадрах организовать. В первом - инициализация переменных цикла, второй - тело цикла, а также проверка счетчика (условия) цикла, третий - переход на второй кадр.

Второй вариант - тот, что предложил iNils и PsichoTiger - onEnterFrame (нужен самостоятельный контроль времени выполнения) или setInterval (контроль реализуется функцией)

Psycho Tiger
30.06.2008, 17:47
Это миф.
Вовсе не миф, прям сейчас пойду и сделаю :D

Чем хуже-то?

iNils
30.06.2008, 17:52
Вовсе не миф, прям сейчас пойду и сделаю :D Чем хуже-то?Миф что лучше. Хуже тем, что идет рассинхронизация таймлаймом, а значит и с фпс, а визуализация происходит по фпс.

Ruffus
30.06.2008, 19:12
Почитал про setInterval. Cложилось впечатление, что это не совсем то, что надо. Попробовал сделать - эффект получился не тот.
Может я и не прав. Похоже, что эта штука поможет скажем повторить несколько однотипных итераций через одинаковые промежутки времени. А когда цикл есть, и надо внутри итерации отсрочить действие.

Наверное, можно выыернуться, но будет громоздко очень.


Для решения этой проблемы есть два пути. Первый вариант - создать 3 кадра, т.е. цикл в трех кадрах организовать. В первом - инициализация переменных цикла, второй - тело цикла, а также проверка счетчика (условия) цикла, третий - переход на второй кадр.

Как это цикл в трёх кадрах? Как это переход из третьего на второй?..

Ruffus
01.07.2008, 14:52
for (var loop = 0; loop <= n; loop++) trace(loop);

Скажите, как заставить флэш ждать в указанном примере после каждой трассировки? И будет ли сам загрузчик считать это временем "отдыха"?

Alex_beginner
01.07.2008, 15:01
Ruffus!

Вы пишите скрипт в кадрах (кадре) на выполнение скрипта кадра отводится всего 15 сек. Если Вы не укладываетесь в него флеш-плэйер выдаст предупреждающее сообщение. И с этим ничего не поделаешь и паузы и байпасы Вам не помогут (ваш код). Обход один - в каждом кадре выполнять такой объем операций цикла, чтобы по времени уложиться в 15 секунд, а остуальную часть перенести на скрипт 2 кадра. Если и во втором кадре останется, то на третьий, итд. Или сделать это все в 3 кадрах.

Что не ясно?!

iNils
01.07.2008, 15:03
Скажите, как заставить флэш ждать в указанном примере после каждой трассировки? И будет ли сам загрузчик считать это временем "отдыха"?Вот как раз здесь и надо использовать setInterval.

Alex_beginner
01.07.2008, 15:06
Здравствуйте iNils! Ждать то он может (имеется ввиду setInterval) вот только вопрос в том, сколько?!!!

Ruffus
01.07.2008, 18:55
Попробовал сделать 5 пустых кадров и в цикле написать что-то вроде

for (var loop = 0; loop <= n; loop++) {
if (loop/500 > _root.currentframe) { _root.nextFrame(); }
}

НЕ помогло. Тот же эффект, предлагает остановить ролик. Заменил 500 на триста, никак. Дело не в кадрах?

crazyone
01.07.2008, 19:34
С этим кодом:
for (var loop = 0; loop <= n; loop++) {
if (loop/500 > _root.currentframe) { _root.nextFrame(); }
}
Будет выполняться весь цикл.
Попробуйте что-то типа:

var interval=setInterval(myLoop,100);
var si=0;
var ei=si+200;
function myLoop(){
for (var loop = si; loop <= ei; loop++) {
if(loop>n){
clearInterval(interval);
break;
}
тело_цикла;
}
si=ei;
ei=si+200;

}


Очень криво, конечно, но где-то рядом.

Ruffus
02.07.2008, 15:26
А могу через setInterval организовать внутри функции вызод подфункции. А то пишу, результата никак не видно. Вот и заподозрил неладное.
У меня этот несчастный цикл находится внутри метода и использует внутри себя кучу локальных переменных. Если его пытаться выделить в
отдельный метод, то надо будет городить чёта с этими переменными. Поэтому я спрашиваю про реальность использования подпрограмм,
функций внутри функций.

Ruffus
21.07.2008, 21:49
Под конец мучений пришёл примерно к такой схеме. Есть метода класса. В нём:

...
loop_counter = 0;
sti = 0;
stj = 0;
duration = 1;
intervalID = setInterval(mainLoop, duration);
function mainLoop() {
for (var i = sti; i <= n; i++) {
...
if (sti == i) j = stj; else j = 0;
while (j <= m) {
...
depth = InstanceManager.getNextDepth(this);
MyClip.create(name, depth, ...);
j++;
loop_counter++;
if (loop_counter >= limit) {
loop_counter = 0;
sti = i;
stj = j;
return;
}
}
}
clearInterval(intervalID);
otherCode();
return;
}

Таким образом, за каждый заход строятся объекты MyClip в количестве limit, потом запоминаются текущие счётчики циклов, и осуществляется выход из функции. Если же проход циклов закончен, что действие setInterval аннулируется и идёт переход к финальным действиям метода, внутри которого всё это разворачивается.

Заметил, что скорость построения объектов уменьшается. Под конец оно занимает уже секунды. Проверил через getTimer время и удивился: там к концу выполнения значения высвечиваются порядка 100000. Так как это в миллисекундах, это получается, что последние клипы строятся по 100 секунд каждый.

Никак не могу понять, что происходит.

crazyone
22.07.2008, 12:57
Лично я отказываюсь разбираться с вашим кодом. Вам не хочется "городить чёта с этими переменными", и в итоге вы мучитесь, пытаясь что-то налепить, не задев ваши локальные переменные. Ну если вам так дорог секс с кодом, я не возражаю, но в этой оргии участия принимать не буду.

Ruffus
23.07.2008, 09:53
Неожиданно
Что я могу сказать.
Мучиться особо не пришлось. Локальные переменные и переменные класса прозрачны для подфункций. Единственное, что мне пришлось сделать - это создать делегатов для других методов класса, использовавшихся внутри подфункции. На этом секс закончился.
Кроме того, последний приведённый кусок кода по своей логике не имеет к этому отношения вообще.

crazyone
23.07.2008, 13:11
Мучиться не пришлось, но прийдется, если работать с этим кодом дальше.
И да, мне кажется, что у вас проблема с InstanceManager.getNextDepth(), который, скорее всего, не предназначен для огромного числа мувиклипов.
А может и еще где-нибудь. Копайтесь в вашем коде, вычисляйте, какой кусок занимает много времени.

джонатан
23.07.2008, 14:15
Помоему правильно не getNextDepth(), а getNextHighestDepth();

Ruffus
23.07.2008, 14:24
2джонатан: там вообще метод getFreeDepth, это статический метод спец. класса.

Код метода из InstanceManager:

static function getFreeDepth(parent:MovieClip):Number{
var depth:Number=0;
while(parent.getInstanceAtDepth(depth))depth++;
return depth;
}

Как будто бы не очень подходит для тысячи клипов, проверок с каждым разом всё больше. Но тест с getTimer мне показал, что на эти проверки тратится время в десятки раз меньшее, чем на создание объектов MyClip.

crazyone
23.07.2008, 18:44
Так на что у вас тратится больше всего времени? именно на createEmptyMovieClip?
Как кто-нибудь может вам помочь, если вы не показываете, как и что у вас создается?

И да, это конечно же может быть банальная нехватка ресурсов у флешплеера. Они у него ограничены, насколько я знаю.

Ruffus
23.07.2008, 20:28
Когда я судил по выводу getTimer, я думал, что больше всего времени занимает MyClip.create(...). Очень сранным было то, что чем дальше, тем медленнее они выводились.
Но я решил по вашему совету попробовать сменить постоянные вызовы depth = InstanceManager.getFreeDepth(this) на простое depth = depth + 1. Тут конечно не всё так просто, но не суть.
После этого положение вещей поправилось. Теперь картина с вложением чуть более 2000 MyClip рисуется за 5 секунд. И, по крайней мере, как я наблюдал, все эти клипы прорисовываются с одинаковой скоростью.
Думаю, что с этой темой можно закончить. Большое спасибо.