![]() |
Дрожание рендера
Добрый день. Наверное с этим уже многие сталкивались. Как избавится от дрожания рендера? Насколько точные результаты дает getTimer()? Где лудше всего просчитывать логику, в таймере или по собитию ENTER_FRAME. У меня при средних и высоких скоростях, заметно неприятное дрожание всего мира, особенно в браузере. Как с этим боротся?
|
Логику считать лучше по таймеру, тк если привязываться к ENTER_FRAME, то скорость течения игрового времени будет разная в зависимости от fps, который зависит от производительности клиентского компа.
|
И таймер, и ENTER_FRAME имеют низкую точность, которая также зависит от браузера. Хуже всего дела обстоят в IE. Из-за этого получается ограничение максимального FPS до 100 в проигрывателе и до 66 в IE.
|
а мой опыт говорит, что считать логику по таймеру отдельно от прорисовки совершенно бесполезно.
Что можно посоветовать. 1. Так как шаг enterFrameHandler непостоянный, то изменять координаты по правилу: Код:
dt = curTime-prevTime;2. Добавить эффекты размытия. Когда что-то быстро движется в реальном мире - мы видим шлейф за этим предметом. При программировании быстрого перемещения об этом забывают, а так как принципы создания изображения на экране таковы, что что изображение меняется скачками - то перемещение выглядит дерганым и неестественным. 3. Неконстантная скорость. В реальном мире предметы разгоняются, движутся на большой скорости, тормозят. Мгновенное ускорение и мгновенная остановка делают перемещение неестественным. Добавить easing надо. |
Мне вот интересно из - за чего дрожание. У меня в таймере в просчет логики идет привязка к милисекундам, тоесть delta = сurrTime - lastTime; Пробовал вызывать updateAfterEvent(), безрезультатно:(. Насколько точно работает getTimer()? Подозреваю что он дает не четкие результаты.
|
Да немного неточно. Ни Timer, ни setInterval, ни getTimer() точного резульатта не дают. Кстати, зависит от fps точность немного. Если сделать 10fps + Timer (33) + eмуте.updateAfterEvent() будет намного дерганей, чем при 40fps. Но задирать эту планку не советую, иначе все процессорное время уйдет тупо на перерисовку экрана.
Вот не знаю, даст ли более точный результат new Date().getTime() чем getTimer() =/ Надобно проверить. |
iflamberg, может сам рендер не успевает обновить картинку?? Это что то напоминает дх, когда фпс не совпадает с частотой развертки монитора, я тогда тоже что - то похожее видел.
|
С помощью updateAfterEvent можно очень сильно поднять FPS, но это настолько сильно загрузит всю систему, что перестанет опрашиваться управление. Примерно так - обновление логики и экрана повесить на таймер с минимальным интервалом и одним повторением, в конце вызываемой функции перезапустить таймер и только тогда updateAfterEvent.
Чтобы понять проблему с точностью таймеров во Flash, можно запустить глухой цикл вывода текущего времени в лог. |
Цитата:
|
Ну тут уж выбирать. Или производительность, или дублировать на задний слой объект с блуром.
|
| Часовой пояс GMT +4, время: 05:14. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.