PDA

Просмотр полной версии : уменьшить дискретность таймера?


PHENIX77
19.07.2005, 17:59
setInterval работает не чаще чем каждую 8-ю милисекунду.
Таким образом можно добиться анимации с частотой 125 фпс, 62.5 фпс и т.д. а что делать если нужна частота обновления, допустим, ровно 50 фпс? Есть ли решение?

Для примера:

view_old=function() {
if (getTimer()-starttimer<txt2.text) return;
txt1.text=getTimer()-starttimer;
starttimer=getTimer();
}

setInterval(view_old,1);
------

txt1 - динамик текст (выходной период)
txt2 - инпут текст (желаемый период)

кратно 8 и все тут...

Заранее спасибо :)

KUZEN
19.07.2005, 18:03
ну в твоём примере ничего не кратно и даже не постоянно +-1 погрешность всё равно есть ...

iNils
19.07.2005, 18:06
setInterval работает не чаще чем каждую 8-ю милисекунду...

чушь полная....

PHENIX77
19.07.2005, 18:30
ну в твоём примере ничего не кратно и даже не постоянно +-1 погрешность всё равно есть ...

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

проблема именно в setInterval.
ставим в txt2 единицу, на выходе получаем 8 (+-1)
ставим 10 - получаем 16, иногда 8...

вот такая странность...

KUZEN
19.07.2005, 18:33
я не поиму суть этих рассуждений , ты скажи чего ты хочешь этим добиться ???

iNils
19.07.2005, 18:38
если запустишь мой пример, то увидишь кратность )))

Запускал... Крастности не обнаружил. Более того, временами вызов функции срабатывал каждые 1 миллисекунду.

Месяц назад обсуждали тему зависимости setInterval и fps и переодичность срабатывания.

KUZEN
19.07.2005, 18:40
Запускал... Крастности не обнаружил. Более того, временами вызов функции срабатывал каждые 1 миллисекунду.

Месяц назад обсуждали тему зависимости setInterval и fps и переодичность срабатывания.
Думаешь он что нибудь искал перед тем как задать вопрос ?

iNils
19.07.2005, 18:46
думаешь он что нибудь искал перед тем как задать вопрос ?
:)
скорее всего он опробывал это на одной машине.

PHENIX77
19.07.2005, 18:49
пробовал на P Iv - 2600 и на P I - 440 результат одинаков...
насчет "уже обсуждали", сорь, не нашел... может быть не знаю потайных архивов... подскажите - пороюсь...

iNils
19.07.2005, 18:53
http://www.flasher.ru/forum/showthread.php?t=65663
http://www.flash-mx.ru/forum/topic_show.pl?tid=187

KUZEN
19.07.2005, 18:55
как видищь ничего потайного здесь нет ...

PHENIX77
19.07.2005, 19:08
Ничего связанного с моей проблемой не нашел (((

Возможно, я чего-то не понимаю... вот пример по-жестче:

myproc1=function () {
txt1.text++; }

myproc2=function () {
txt2.text++; }

setInterval(myproc1,66);
setInterval(myproc2,70);

числа в полях - аки синхронные плавцы, хотя интервал разный...
Ну и чем это объяснить?

Если у кого-то числа разойдутся, значит у меня тут полтергейст или чего похуже )))

iNils
19.07.2005, 19:14
Ничего связанного с моей проблемой не нашел (((

Там разбирается проблемы setInterval.


Твой второй пример...у меня расхождения после каждых 2 синхронных вывода.

PHENIX77
19.07.2005, 19:16
у меня Flash 6.0, Pentium IV - 2600 (WinXP) и Pentium - 440 (Win98).
Видимо нужно искать еще компы... т.к. у меня расходений нет (((

PHENIX77
19.07.2005, 22:40
Вот еще более четкий пример:

myproc1=function () {
PP++;
if (getTimer()-StartTimer<1000) return;
txt1.text=getTimer()-StartTimer;
txt2.text=PP;
PP=0;
StartTimer=getTimer();
}

setInterval(myproc1,1);
-----

setInterval срабатывает 125 раз в секунду, если запускать из FlashPlayer'a и 65 раз в секунду, если паблишить в HTML (т.е. SWF)...

Проверил на 6-и ! машинах, все одно - 65 раз в секунду срабатывает PP++ , т.е. столько же запускается функция...

У меня одно подозрение, что компилятор сломанный - но, это ближе к абсурду...

Неуже ли все умы спят? Интересная ж задачка...

Смольный (Smolniy)
19.07.2005, 23:47
Ну, во-первых If interval is less than the SWF file’s frame rate (for example, 10 frames per second [fps] is equal to 100 milliseconds), the interval function is called as close to interval as possible. You must use the updateAfterEvent() function to make sure that the screen refreshes often enough. If interval is greater than the SWF file’s frame rate, the interval function is only called each time the playhead enters a frame; this minimizes the impact each time the screen is refreshed.Говоря проще, setInterval округляется до fps. Если же интервал меньше 1fps, то нам ничего не гарантируют. :)
Во-вторых, setInterval устанавливает время не между вызовами функции, а между концом предыдущего и началом последующего вызова.
Так или иначе, setInterval нельзя использовать ни для точного определения события "время Х", ни для синхронизации связанных алгоритмов. Лично я воспринимаю setInterval как более короткую запись алгоритма, написанного с помощью getTimer и имеющего такую же погрешность (до 1 fps)



Кстати, btw, предубеждение против onEnterFrame мне совершенно непонятно. Никаких цифр тормозов от enterFrame я пока не видел, а забыть бесхозный интервал гораздо легче, чем прощелкать OnEnterFrame, не говоря того, что вроде как неизвестно, какие именно механизмы обеспечивают работу setInterval и не напряжнее ли они для проца, чем onEnterFrame (как в свое время было с tellTarget, with и точечной нотацией).

iNils
20.07.2005, 12:00
полностью согласен с смольным по поводу последнего абзаца.

PHENIX77
21.07.2005, 15:52
Осознал бяку с fps, покопался еще и вот что у меня вышло...
Если поставить fps сцены на максимум, то срабатываение setInterval происходит 700-800 раз в секунду - супер! Но есть и ложка дегтя:
запускаем SWF через браузер (у меня честный 6-ой осел) - и вот подставка - срабатывание происходит не чаще чем 65 раз в сек. (((

Я вообще хочу создать плавное движение по сложной функции... для этого расчеты координат хотелось бы проводить с серьезной частотой, а уж обновление сцены - это вопрос производительности проца/видео-карты (сколько успеет, столько и хорошо)...

по-сему вопрос - как добиться вызова функции обсчета чаще, чем fps сцены?
повторюсь - если запускать во флеш-проигрывателе, все чудесно работает...

Есть мнения?
P.S. можно, конечно, рассчитать координаты через время, но это последнее, что я буду делать - слишком трудоемко... мне нужен именно накопительный эффект, хотя бы 500 tps...

iNils
21.07.2005, 15:59
У телевидения fps 25 (в америке 30) и никто не жалуется...или жалуется?

PHENIX77
21.07.2005, 16:00
я говорю не о частоте изображения, а о частоте кадров обсчета...
давно бы сказали - что нельзя или сделай вот так-то...
мне просто непонятно, почему в плеере все работает, а в эксплорере - фигу...

iNils
21.07.2005, 16:11
самый простой вариант: за один кадр обсчитывать значения за 10.. в цикле

PHENIX77
21.07.2005, 16:16
Короче, никто, видимо, с такой проблемой не сталкивался, посему я сделал вот так (на примере циферок):

this.onEnterFrame=function() {
A=getTimer()-StartTimer;
while (getTimer()>StartTimer) {
StartTimer++;
PP++; // вот тут вычисления...
}
B=PP;
PP=0;
StartTimer=getTimer();
}

иными словами выкрутился через одно место...
зато добился 1000 tps... при любом раскладе...

Всем спасибо, думаю тему можно закрыть...

PHENIX77
21.07.2005, 16:19
самый простой вариант: за один кадр обсчитывать значения за 10.. в цикле

Типа спасибо... Синхронное срабатывание цепей двух мозгов, настроенных на одну задачу, называется )))

Смольный (Smolniy)
21.07.2005, 19:03
Раньше ограничение на fps было 120, если я не ошибаюсь. 700-800 просчетов в секунду - поразительный результат. Если в браузере не дает больше 65 раз в секунду, возникает ощущение, что это ограничение браузерного плагина. Впрочем, вполне вменяемое ограничение. Человек видит примерно 30 раз в секунду, большие частоты малоосмыслены. Полезность 60-ти Гц еще просматривается, 700-800 это уже передоз.
Самое правильное в данном случае, конечно, привязка ко времени.