Просмотр полной версии : Клипы на сцене
У меня по логике пиложения существует вложенность клипов. В результате в одном из клипов этой иерархии создаётся большое количество маленьких клипов. Но по практике я вижу, что дело не в их сложности, а именно в количестве. Вопрос такой. Сколько клипов я могу расположить на сцене? Какие существуют ограничения на вложенность?
Alex_beginner
28.06.2008, 17:03
Здравствуйте Ruffus!
Собственно теоретически нет ограничений на глубину вложенности. Однако, если Вы создадите множество клипов с различными глубинами вложенности это может привести к преждевременному "коллапсу" и скоропостижной "смерти" FlashPlayer'а.:)
У меня, естественно, у всех клипов различная глубина. Чем дальше, тем выше. Но вложенности там запредельной нет, уровня 3-4. Фишка в том, что когда на соотв-м уровне количество клипов около тысячи, флэш подвисает, подом выдаёт сообщение с вопросом об аборте загрузки мувика.
количество клипов около тысячиДля as1/as2 это слишком много. Создавайте не за раз, а в течении какого то времени (по 100-200 за один кадр). А теоретически можно создать 1064960 клипов в каждом клипе.
То есть это слишком большая нагрузка на кадр? Предлагаете по мере создания клипов переключаться на следующие кадры?
я создал в мувике десять пустых кадров, переключаю их по мере создания кучи клипов. Проблема не решилась, только неприятные эффекты появились вроде перемигивания самого мувика.
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, имхо лучше.
ЗЫ извиняюсь за отсуствие типизации, ибо все равно код никому не нужный - показан чисто для примера.
Но я бы сделал это через setInterval, имхо лучше.Это миф.
Alex_beginner
30.06.2008, 17:11
Ruffus! Тут нужно понять, что на Выполнение кода кадра отводится 15 секунд, апосля Флеш выдает предупреждающее сообщение о том, что код тормозит выполнение приложения и предлагает выбор - продолжить выполнение скрипта или нет.
Для решения этой проблемы есть два пути. Первый вариант - создать 3 кадра, т.е. цикл в трех кадрах организовать. В первом - инициализация переменных цикла, второй - тело цикла, а также проверка счетчика (условия) цикла, третий - переход на второй кадр.
Второй вариант - тот, что предложил iNils и PsichoTiger - onEnterFrame (нужен самостоятельный контроль времени выполнения) или setInterval (контроль реализуется функцией)
Psycho Tiger
30.06.2008, 17:47
Это миф.
Вовсе не миф, прям сейчас пойду и сделаю :D
Чем хуже-то?
Вовсе не миф, прям сейчас пойду и сделаю :D Чем хуже-то?Миф что лучше. Хуже тем, что идет рассинхронизация таймлаймом, а значит и с фпс, а визуализация происходит по фпс.
Почитал про setInterval. Cложилось впечатление, что это не совсем то, что надо. Попробовал сделать - эффект получился не тот.
Может я и не прав. Похоже, что эта штука поможет скажем повторить несколько однотипных итераций через одинаковые промежутки времени. А когда цикл есть, и надо внутри итерации отсрочить действие.
Наверное, можно выыернуться, но будет громоздко очень.
Для решения этой проблемы есть два пути. Первый вариант - создать 3 кадра, т.е. цикл в трех кадрах организовать. В первом - инициализация переменных цикла, второй - тело цикла, а также проверка счетчика (условия) цикла, третий - переход на второй кадр.
Как это цикл в трёх кадрах? Как это переход из третьего на второй?..
for (var loop = 0; loop <= n; loop++) trace(loop);
Скажите, как заставить флэш ждать в указанном примере после каждой трассировки? И будет ли сам загрузчик считать это временем "отдыха"?
Alex_beginner
01.07.2008, 15:01
Ruffus!
Вы пишите скрипт в кадрах (кадре) на выполнение скрипта кадра отводится всего 15 сек. Если Вы не укладываетесь в него флеш-плэйер выдаст предупреждающее сообщение. И с этим ничего не поделаешь и паузы и байпасы Вам не помогут (ваш код). Обход один - в каждом кадре выполнять такой объем операций цикла, чтобы по времени уложиться в 15 секунд, а остуальную часть перенести на скрипт 2 кадра. Если и во втором кадре останется, то на третьий, итд. Или сделать это все в 3 кадрах.
Что не ясно?!
Скажите, как заставить флэш ждать в указанном примере после каждой трассировки? И будет ли сам загрузчик считать это временем "отдыха"?Вот как раз здесь и надо использовать setInterval.
Alex_beginner
01.07.2008, 15:06
Здравствуйте iNils! Ждать то он может (имеется ввиду setInterval) вот только вопрос в том, сколько?!!!
Попробовал сделать 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;
}
Очень криво, конечно, но где-то рядом.
А могу через setInterval организовать внутри функции вызод подфункции. А то пишу, результата никак не видно. Вот и заподозрил неладное.
У меня этот несчастный цикл находится внутри метода и использует внутри себя кучу локальных переменных. Если его пытаться выделить в
отдельный метод, то надо будет городить чёта с этими переменными. Поэтому я спрашиваю про реальность использования подпрограмм,
функций внутри функций.
Под конец мучений пришёл примерно к такой схеме. Есть метода класса. В нём:
...
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
Лично я отказываюсь разбираться с вашим кодом. Вам не хочется "городить чёта с этими переменными", и в итоге вы мучитесь, пытаясь что-то налепить, не задев ваши локальные переменные. Ну если вам так дорог секс с кодом, я не возражаю, но в этой оргии участия принимать не буду.
Неожиданно
Что я могу сказать.
Мучиться особо не пришлось. Локальные переменные и переменные класса прозрачны для подфункций. Единственное, что мне пришлось сделать - это создать делегатов для других методов класса, использовавшихся внутри подфункции. На этом секс закончился.
Кроме того, последний приведённый кусок кода по своей логике не имеет к этому отношения вообще.
crazyone
23.07.2008, 13:11
Мучиться не пришлось, но прийдется, если работать с этим кодом дальше.
И да, мне кажется, что у вас проблема с InstanceManager.getNextDepth(), который, скорее всего, не предназначен для огромного числа мувиклипов.
А может и еще где-нибудь. Копайтесь в вашем коде, вычисляйте, какой кусок занимает много времени.
джонатан
23.07.2008, 14:15
Помоему правильно не getNextDepth(), а getNextHighestDepth();
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?
Как кто-нибудь может вам помочь, если вы не показываете, как и что у вас создается?
И да, это конечно же может быть банальная нехватка ресурсов у флешплеера. Они у него ограничены, насколько я знаю.
Когда я судил по выводу getTimer, я думал, что больше всего времени занимает MyClip.create(...). Очень сранным было то, что чем дальше, тем медленнее они выводились.
Но я решил по вашему совету попробовать сменить постоянные вызовы depth = InstanceManager.getFreeDepth(this) на простое depth = depth + 1. Тут конечно не всё так просто, но не суть.
После этого положение вещей поправилось. Теперь картина с вложением чуть более 2000 MyClip рисуется за 5 секунд. И, по крайней мере, как я наблюдал, все эти клипы прорисовываются с одинаковой скоростью.
Думаю, что с этой темой можно закончить. Большое спасибо.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.