![]() |
Клипы на сцене
У меня по логике пиложения существует вложенность клипов. В результате в одном из клипов этой иерархии создаётся большое количество маленьких клипов. Но по практике я вижу, что дело не в их сложности, а именно в количестве. Вопрос такой. Сколько клипов я могу расположить на сцене? Какие существуют ограничения на вложенность?
|
Здравствуйте Ruffus!
Собственно теоретически нет ограничений на глубину вложенности. Однако, если Вы создадите множество клипов с различными глубинами вложенности это может привести к преждевременному "коллапсу" и скоропостижной "смерти" FlashPlayer'а.:) |
У меня, естественно, у всех клипов различная глубина. Чем дальше, тем выше. Но вложенности там запредельной нет, уровня 3-4. Фишка в том, что когда на соотв-м уровне количество клипов около тысячи, флэш подвисает, подом выдаёт сообщение с вопросом об аборте загрузки мувика.
|
Цитата:
|
То есть это слишком большая нагрузка на кадр? Предлагаете по мере создания клипов переключаться на следующие кадры?
|
я создал в мувике десять пустых кадров, переключаю их по мере создания кучи клипов. Проблема не решилась, только неприятные эффекты появились вроде перемигивания самого мувика.
|
Цитата:
Код:
i=100000;Если создавать их через временной интервал - то он создат быстренько 100 мувиков, передохнет чуток, снова сделает - снова передохнет. Есть отдых - значит он не завис, и скрипт убивать не нужно. Цитата:
То есть Код:
i=0;ЗЫ извиняюсь за отсуствие типизации, ибо все равно код никому не нужный - показан чисто для примера. |
Цитата:
|
Ruffus! Тут нужно понять, что на Выполнение кода кадра отводится 15 секунд, апосля Флеш выдает предупреждающее сообщение о том, что код тормозит выполнение приложения и предлагает выбор - продолжить выполнение скрипта или нет.
Для решения этой проблемы есть два пути. Первый вариант - создать 3 кадра, т.е. цикл в трех кадрах организовать. В первом - инициализация переменных цикла, второй - тело цикла, а также проверка счетчика (условия) цикла, третий - переход на второй кадр. Второй вариант - тот, что предложил iNils и PsichoTiger - onEnterFrame (нужен самостоятельный контроль времени выполнения) или setInterval (контроль реализуется функцией) |
Цитата:
Чем хуже-то? |
Цитата:
|
Почитал про setInterval. Cложилось впечатление, что это не совсем то, что надо. Попробовал сделать - эффект получился не тот.
Может я и не прав. Похоже, что эта штука поможет скажем повторить несколько однотипных итераций через одинаковые промежутки времени. А когда цикл есть, и надо внутри итерации отсрочить действие. Наверное, можно выыернуться, но будет громоздко очень. Цитата:
|
Код:
for (var loop = 0; loop <= n; loop++) trace(loop); |
Ruffus!
Вы пишите скрипт в кадрах (кадре) на выполнение скрипта кадра отводится всего 15 сек. Если Вы не укладываетесь в него флеш-плэйер выдаст предупреждающее сообщение. И с этим ничего не поделаешь и паузы и байпасы Вам не помогут (ваш код). Обход один - в каждом кадре выполнять такой объем операций цикла, чтобы по времени уложиться в 15 секунд, а остуальную часть перенести на скрипт 2 кадра. Если и во втором кадре останется, то на третьий, итд. Или сделать это все в 3 кадрах. Что не ясно?! |
Цитата:
|
Здравствуйте iNils! Ждать то он может (имеется ввиду setInterval) вот только вопрос в том, сколько?!!!
|
Попробовал сделать 5 пустых кадров и в цикле написать что-то вроде
Код:
for (var loop = 0; loop <= n; loop++) { |
С этим кодом:
Код:
for (var loop = 0; loop <= n; loop++) {Попробуйте что-то типа: Код:
var interval=setInterval(myLoop,100); |
А могу через setInterval организовать внутри функции вызод подфункции. А то пишу, результата никак не видно. Вот и заподозрил неладное.
У меня этот несчастный цикл находится внутри метода и использует внутри себя кучу локальных переменных. Если его пытаться выделить в отдельный метод, то надо будет городить чёта с этими переменными. Поэтому я спрашиваю про реальность использования подпрограмм, функций внутри функций. |
Под конец мучений пришёл примерно к такой схеме. Есть метода класса. В нём:
Код:
...Заметил, что скорость построения объектов уменьшается. Под конец оно занимает уже секунды. Проверил через getTimer время и удивился: там к концу выполнения значения высвечиваются порядка 100000. Так как это в миллисекундах, это получается, что последние клипы строятся по 100 секунд каждый. Никак не могу понять, что происходит. |
Лично я отказываюсь разбираться с вашим кодом. Вам не хочется "городить чёта с этими переменными", и в итоге вы мучитесь, пытаясь что-то налепить, не задев ваши локальные переменные. Ну если вам так дорог секс с кодом, я не возражаю, но в этой оргии участия принимать не буду.
|
Неожиданно
Что я могу сказать. Мучиться особо не пришлось. Локальные переменные и переменные класса прозрачны для подфункций. Единственное, что мне пришлось сделать - это создать делегатов для других методов класса, использовавшихся внутри подфункции. На этом секс закончился. Кроме того, последний приведённый кусок кода по своей логике не имеет к этому отношения вообще. |
Мучиться не пришлось, но прийдется, если работать с этим кодом дальше.
И да, мне кажется, что у вас проблема с InstanceManager.getNextDepth(), который, скорее всего, не предназначен для огромного числа мувиклипов. А может и еще где-нибудь. Копайтесь в вашем коде, вычисляйте, какой кусок занимает много времени. |
Помоему правильно не getNextDepth(), а getNextHighestDepth();
|
2джонатан: там вообще метод getFreeDepth, это статический метод спец. класса.
Код метода из InstanceManager: Код:
static function getFreeDepth(parent:MovieClip):Number{ |
Так на что у вас тратится больше всего времени? именно на createEmptyMovieClip?
Как кто-нибудь может вам помочь, если вы не показываете, как и что у вас создается? И да, это конечно же может быть банальная нехватка ресурсов у флешплеера. Они у него ограничены, насколько я знаю. |
Когда я судил по выводу getTimer, я думал, что больше всего времени занимает MyClip.create(...). Очень сранным было то, что чем дальше, тем медленнее они выводились.
Но я решил по вашему совету попробовать сменить постоянные вызовы depth = InstanceManager.getFreeDepth(this) на простое depth = depth + 1. Тут конечно не всё так просто, но не суть. После этого положение вещей поправилось. Теперь картина с вложением чуть более 2000 MyClip рисуется за 5 секунд. И, по крайней мере, как я наблюдал, все эти клипы прорисовываются с одинаковой скоростью. Думаю, что с этой темой можно закончить. Большое спасибо. |
| Часовой пояс GMT +4, время: 07:24. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.