Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Клипы на сцене (http://www.flasher.ru/forum/showthread.php?t=113428)

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

Цитата:

Сообщение от Ruffus (Сообщение 748590)
количество клипов около тысячи

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

Ruffus 29.06.2008 16:43

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

Ruffus 30.06.2008 12:06

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

Psycho Tiger 30.06.2008 14:20

Цитата:

Сообщение от Ruffus (Сообщение 748635)
То есть это слишком большая нагрузка на кадр? Предлагаете по мере создания клипов переключаться на следующие кадры?

Нет никакой нагрузки на кадр. Поясню:
Код:

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

Цитата:

Сообщение от Psycho Tiger (Сообщение 748902)
Но я бы сделал это через setInterval, имхо лучше.

Это миф.

Alex_beginner 30.06.2008 17:11

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

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

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

Psycho Tiger 30.06.2008 17:47

Цитата:

Сообщение от iNils (Сообщение 748945)
Это миф.

Вовсе не миф, прям сейчас пойду и сделаю :D

Чем хуже-то?

iNils 30.06.2008 17:52

Цитата:

Сообщение от Psycho Tiger (Сообщение 748962)
Вовсе не миф, прям сейчас пойду и сделаю :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

Цитата:

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

Вот как раз здесь и надо использовать 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 секунд. И, по крайней мере, как я наблюдал, все эти клипы прорисовываются с одинаковой скоростью.
Думаю, что с этой темой можно закончить. Большое спасибо.


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

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