Форум 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)
-   -   setInterval vs. onEnterFrame (http://www.flasher.ru/forum/showthread.php?t=128520)

psyh 11.08.2009 02:53

setInterval vs. onEnterFrame
 
Что лучше использовать, setInterval или OnEnterFrame? И при каких случаях... В моём случае массовое создание клипов (не больше 1000). Каждый клип двигается с поможу одного из этих методов. Какой лучше использовать?

alekslitvinenk 11.08.2009 03:23

для каждой ситуации по-разному: иногда удобно использовать onEnterFrame, иногда - setInterval.
Разница в том, что событие onEnterFrame вызывается с частотой frame rate у вашего swf, а setInterval вызывает функцию через заданный промежуток времени.

psyh 11.08.2009 05:39

ну да, это я знаю, но я ещё слышал что setInterval плохо работает в АС2. Может де статейка интересная есть?

VVall 11.08.2009 06:48

Таймеры во Flash вообще своеобразно работают, независимо от версии AS. У них низкая точность, она зависит от браузера и даже от выставленного в ролике FPS (чем ниже, тем меньше точность).

psyh 11.08.2009 12:23

тада, я заметил, но всё же не могу выбрать между этими двумя методами)

Xero201 11.08.2009 23:43

Цитата:

Сообщение от psyh (Сообщение 841836)
ну да, это я знаю, но я ещё слышал что setInterval плохо работает в АС2. Может де статейка интересная есть?

В книге "Flash. Трюки" (автор Шам Бхангал), есть две интересные главы "Активизация движения пользователем (нарушение монополии onEnterFrame)" и "Синхронизация анимации по времени".
В кратце - "при высоких требованиях к плавности анимации лучше юзать setInterval т.к.:
  • можно задавать меньшие промежутки времени, не увеличивая обновление (перерисовку) экрана.
  • разные составляющие анимации могут воспроизводиться с разной скоростью
  • независимость от FPS в проекте и продолжительности анимации
" (с)
Но вообще, alekslitvinenk прав, и даже в упомянутой выше книге, целый раздел (глава) посвящен оптимизации различных типов анимации, так что одной статейки маловато будет

orcpochta 12.08.2009 01:57

Уважаемые, подскажите, как получить значение frame rate в самом фильме и можно ли его динамически менять?

etc 12.08.2009 07:54

В AS1/AS2 нельзя никак.

Zik. 12.08.2009 08:52

я стараюсь почти всегда пользоваться onEnterFram'ом
setInterval как-то мне не по душе

vanguish 12.09.2009 00:42

А что загружает больше систему?
Если только в производительности вопрос... что лучше: 10 setInterval или OnEnterFrame?

mooncar 12.09.2009 04:05

Всегда пользуюсь setInterval, в силу того, что:
# разные составляющие анимации могут воспроизводиться с разной скоростью
# независимость от FPS в проекте и продолжительности анимации
Не понимаю, для чего вообще нужен onEnterFrame: пусть номинально, но он все-таки жестко диктует поведением анимированной с его помощью деталью ролика..

NoCD 12.09.2009 04:22

setInterval больше для анимации, а onEnterFrame для кодинга.

Zik. 12.09.2009 10:38

onEnterFrame можно легко первратить в setInterval(); и производительность будет куда лучше

mooncar 12.09.2009 10:43

Цитата:

Сообщение от ZIK68 (Сообщение 850238)
легко первратить в setInterval()

Например как?

Zik. 12.09.2009 11:08

это
Код AS1/AS2:

var shet:Number = 0;
var fps:Number = 12; //переменная fps  равна fps ролика
function privet():Void {
        if (shet == fps) {
                trace("Привет!");
                shet = 0;
        } else {
                shet++
        }
}
onEnterFrame = privet;

эквивалентно
Код AS1/AS2:

function privet():Void {
        trace("Привет!");
}
setInterval(privet, 1000);


mooncar 12.09.2009 11:35

Можно. Вопрос - зачем такие сложности?

Против:

1. Усложнение организации процессов с разными скоростями.
Вот, например, у меня почти во всех проектах есть функция, которая делает плавное появление/убираение объектов на сцене. Делает это она с помощью изменения альфы и при этом используется setInterval. Ей я в качестве одного аргумента передается величина интервала. Это гибко - одни объекты появляются с одной скоростью, другие - с другой, и т.д. Зависист только от времени, которое я передаю как аргумент. А с использованием onEnterFrame придется в эту ф-ю вводить еще и дополнительные телодвижения для коррекции, так как без этого привязка будет строго к частоте кадров, и сделать быстрее-медленнее я не смогу.
setInterval - пусть с оговорками - но мы можем явно задать частоту выполнения каких-либо действий, onEnterFrame - никак.

2. Необходимость в привязке к мувику или _root. Потенциальный лишний мусор на сцене.
Для onEnterFrame нужен мувик-привязка (this.onEnterFrame = ..., mc1.onEnterFrame), для интервала- не нужен.
Если у вас проектик небольшой - пофигу, если нет, и используются несколько периодических действий? Придется навешивать несколько onEnterFrame на разные объекты, включая this. А если это нежелательно? Или если уже все объекты заняты - придется создавать мусорные.
Для достаточно сложных проектов - опять-таки - всегда нужно помнить, куда что привязано и следить, чтобы мувик с нужной функцией всегда был на сцене.

3. Остановка процесса.
То же самое - с остановкой процесса. Для интервала - достаточто clearInterval. Для onEnterFrame - нужно сделать delete mc.onEnterFrame, то есть для безусловной остановки нужно удалять ссылку на описанную функцию с мувика.
Можно сделать проверку выполнения условий внутри onEnterFrame, скажете вы, но вопрос - зачем таие сложности - непрерывные дополнительные вычисления?

Есть еще аргументы против onEnterFrame.
А что вы можете сказать "за"?

Добавлено через 10 минут
4. Негибкость с параметрами.
В интервальную функцию я могу легко передать параметр:
Код AS1/AS2:

ID =  setInterval (doItEasy, 10, 'Привет!');
 
function doItEasy(mess:String) {
 trace(mess);
}

Для передачи аргумента в функцию onEnterFrame нужны дополнительные телодвижения:

Код AS1/AS2:

mc.mess = 'Привет!';
mc.onEnterFrame = doItHard;
function doItHard() {
 trace(this.mess);
}


Zik. 12.09.2009 12:18

ммм.... ну убедили...
но когда важна скорость, то лучше onEnterFrame использовать

mooncar 12.09.2009 12:32

Можно понудничать? :) Контрольный выстрел:
А что значит - если нужна скорость? И какие тут достоинства у onEnterFrame?
Мне правда интересно. Просто "для скорости" в интервальной функции я могу задать промежутки выполнения каких-то действий меньше частоты отрисовки кадров (хотя на флешкин таймер все ругаются, я еще правда не сталкивался), а в onEnterFrame как это сделать?

Zik. 12.09.2009 13:00

Цитата:

Просто "для скорости" в интервальной функции я могу задать промежутки выполнения каких-то действий меньше частоты отрисовки кадров, а в onEnterFrame как это сделать?
см. пример кода выше

Цитата:

А что значит - если нужна скорость? И какие тут достоинства у onEnterFrame?
было дело, надо было проверять на столкновение пули и двигать их
использовал setInterval - через некоторое время начинало тормозить
заюзал onEnterFrame - все прекрасно стало работать

etc 12.09.2009 13:05

Цитата:

Сообщение от mooncar (Сообщение 850259)
я могу задать промежутки выполнения каких-то действий меньше частоты отрисовки кадров

Зачем?

mooncar 12.09.2009 13:25

Допустим частота кадров низкая.
Код AS1/AS2:

ID  = setInterval(counter, 10);
count = 0;
function counter () {
        count++;
        counter_tf.text = count;
        updateAfterEvent();
}

даст нам нормальный ход счетчика.
Но вообще, то же самое можно сделать и для onEnterFrame, но с ухищрениями.
Разве не так?

К тому же данные не всегда нужны сразу на сцене, могут использоваться где-то в дальнейшем.

iNils 12.09.2009 13:29

Для анимации всегда использую onEnterFrame. setInterval не отрисовывает изменения без смены кадра, что может создавать рывки в движении, а вызов в разных местах updateAfterEvent дает лишнию нагрузку.
Для запуска многочисленных процессов с параметрами, используется один onEnterFrame, который пишется в класс менеджер.
setInterval использую только для отложенных и несвязанных с таймлайном действий, типа: если мышка не двигается 10 секунд, то сделать это.

mooncar 12.09.2009 13:29

Но вообще, справедливо конечно то, что от fps работа интервальной функции тоже зависит :(

Добавлено через 2 минуты
Цитата:

Сообщение от iNils (Сообщение 850279)
Для запуска многочисленных процессов с параметрами, используется один одним onEnterFrame, который пишется в класс менеджере.

А как организована остановка?

iNils 12.09.2009 13:35

Цитата:

fps работа интервальной функции тоже зависит
http://www.flasher.ru/forum/showthre...ht=setInterval

Psycho Tiger 12.09.2009 22:30

iNils все верно сказал.
От себя ещё добавлю - если пойдет очень тяжелая нагрузка на процессор - упадет фпс и следовательно onEnterFrame будет вызываться реже, снижая нагрузку на процессор - и все встанет на круги своя со временем. setInterval`у же безразлично, и он может легко повесить плеер.
Другой вопрос, что нельзя допускать падения фпс.

vanguish 14.09.2009 16:32

Оба методы хороши, когда знаешь когда их применять!!!
КАк по мне.. если нужно экономить реурсы системы, всегда использую setInterval ... задал частоту срабатывания ... если тормоза есть... уменьшаешь её.... то есть позволяет легко настраивать потребление ресурсов.
А для срабатывания какх-нить действий..
Цитата:

setInterval использую только для отложенных и несвязанных с таймлайном действий, типа: если мышка не двигается 10 секунд, то сделать это.
Тут только и настоятельно setInterval !! никаких onEnterFrame


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

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