|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
ENTER_FRAME (25fps) и setInterval(40)
Есть ролик, fps=25.
Если выполнять функцию по слушателю на Event.ENTER_FRAME, то результат выглядит хорошо Если выполнять ту же функцию через setInterval(..., 40) или Timer(40), то результат выглядит плохо (двигайте кружок стрелками управления) Разница проявляется только при просмотре через браузер. Почему так? |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Потому, что у вас чехарда в коде.
В fFrame.swf, внутри onFrameEnter сначала выполняется некий код, а потом дергается game. И все работает синхронно. А в fTimer.swf, некий код продолжает работать внутри onFrameEnter, но game дергается из timerEvent. Только вот события работаю не синхронно. То, что вы поставили Timer(40), не говорит о том, что он будет срабатывать синхронно с onFrameEnter. Таймер может сработать и через 50 мс. |
|
|||||
нет, это не причина. Я могу вообще убрать onFrameEnter в fTimer.swf и отображать (присваивать координаты) внутри game, это будет делаться каждые 40мс согласно setInterval
То, что там так написано - это следствие моих экспериментов с onFrameEnter vs setInterval. Я пытался понять, при каких условиях будет дёргание, а при каких не будет. Добавлено через 7 минут Вот, так как было изначально: только setInterval смотреть Соответственно класс, который вы любезно посмотрели, я выложил для удобства рядом же |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Возможно потому что render всегда идёт строго после enter frame. А при таймере - не всегда. Т.е. между двумя вызовами рендера может быть как 0 вызовов таймера, так и два (а надо бы один). Это можно проверить экспериментально =)
update after event был какой-то, по идее поможет. А лучше тупо по фрейму)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. Последний раз редактировалось -De-; 13.07.2011 в 16:38. |
|
|||||
интересно не только, что setInterval(...,40) и ENTER_FRAME при фпс 25 ведут себя по-разному (по идее и там и там функция должна выполняться 25 раз в секунду + и там и там фпс ролика один и тот же), но и то, что различие проявляется только в браузере. Нагрузки тут никакой нет, т.к. вычисления минимальны (меньше 1 мс), фпс не большой (я помню, что браузеры не дают больше 60 фпс)
|
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Тут дело в равномерности. Там не ровно 40мс, а пляшет этак по +=10. Причем и при рендере/фрейме и при таймере. Если оно пляшет по-разному - получайте неравномерность движения.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
-De-, разумно, но ставим эксперимент: меняем координаты шариков только по ENTER_FRAME, а вычисления проводим в setInterval. Причём фпс ставим 50, а считаем 25 раз в секунду. (iNils, это то, что вы назвали чехардой). При таком раскладе, рендер должен всегда отображать каждое перемещение (т.к. проходит в 2 раза чаще, чем вычисление новых координат). Но увы, результат плохой - выглядит в браузере нехорошо.
|
|
|||||
когда считаем раз в 40мс, а отображаем раз в 20 мс, отобразится результат каждого пересчёта - разве нет?
iNils, можно не этот код, а для теста: var circle:Sprite = new Sprite(); circle.graphics.beginFill(0x00FF00); circle.graphics.drawCircle(0,0,10); circle.graphics.endFill(); circle.x = 60; circle.y = 20; addChild(circle) var speed:Number = 3; //setInterval(calculate, 40); addEventListener(Event.ENTER_FRAME, onFrameEnter); function onFrameEnter(event:Event):void { calculate(); } function calculate():void { if((circle.x > 250)||(circle.x < 50)) { speed *=-1; } circle.x += speed; } и, собственно, к зависимости от браузера: получается, погрешность fps, setInterval и Timer становится сильной при отображении через браузер? |
Часовой пояс GMT +4, время: 15:45. |
|
« Предыдущая тема | Следующая тема » |
|
|