|
|
|||||
Регистрация: Nov 2007
Сообщений: 53
|
Дрожание рендера
Добрый день. Наверное с этим уже многие сталкивались. Как избавится от дрожания рендера? Насколько точные результаты дает getTimer()? Где лудше всего просчитывать логику, в таймере или по собитию ENTER_FRAME. У меня при средних и высоких скоростях, заметно неприятное дрожание всего мира, особенно в браузере. Как с этим боротся?
|
|
|||||
strange mood
|
Логику считать лучше по таймеру, тк если привязываться к ENTER_FRAME, то скорость течения игрового времени будет разная в зависимости от fps, который зависит от производительности клиентского компа.
__________________
тонкий тролль, осеянный благодатью |
|
|||||
Регистрация: Feb 2009
Сообщений: 1,195
|
И таймер, и ENTER_FRAME имеют низкую точность, которая также зависит от браузера. Хуже всего дела обстоят в IE. Из-за этого получается ограничение максимального FPS до 100 в проигрывателе и до 66 в IE.
|
|
|||||
Регистрация: Jan 2009
Сообщений: 1,651
|
а мой опыт говорит, что считать логику по таймеру отдельно от прорисовки совершенно бесполезно.
Что можно посоветовать. 1. Так как шаг enterFrameHandler непостоянный, то изменять координаты по правилу: т.е. приращение координат зависит от времени, что прошло между двумя кадрами, а не константно. 2. Добавить эффекты размытия. Когда что-то быстро движется в реальном мире - мы видим шлейф за этим предметом. При программировании быстрого перемещения об этом забывают, а так как принципы создания изображения на экране таковы, что что изображение меняется скачками - то перемещение выглядит дерганым и неестественным. 3. Неконстантная скорость. В реальном мире предметы разгоняются, движутся на большой скорости, тормозят. Мгновенное ускорение и мгновенная остановка делают перемещение неестественным. Добавить easing надо. |
|
|||||
Регистрация: Nov 2007
Сообщений: 53
|
Мне вот интересно из - за чего дрожание. У меня в таймере в просчет логики идет привязка к милисекундам, тоесть delta = сurrTime - lastTime; Пробовал вызывать updateAfterEvent(), безрезультатно. Насколько точно работает getTimer()? Подозреваю что он дает не четкие результаты.
|
|
|||||
Регистрация: Jan 2009
Сообщений: 1,651
|
Да немного неточно. Ни Timer, ни setInterval, ни getTimer() точного резульатта не дают. Кстати, зависит от fps точность немного. Если сделать 10fps + Timer (33) + eмуте.updateAfterEvent() будет намного дерганей, чем при 40fps. Но задирать эту планку не советую, иначе все процессорное время уйдет тупо на перерисовку экрана.
Вот не знаю, даст ли более точный результат new Date().getTime() чем getTimer() =/ Надобно проверить. |
|
|||||
Регистрация: Nov 2007
Сообщений: 53
|
iflamberg, может сам рендер не успевает обновить картинку?? Это что то напоминает дх, когда фпс не совпадает с частотой развертки монитора, я тогда тоже что - то похожее видел.
|
|
|||||
Регистрация: Feb 2009
Сообщений: 1,195
|
С помощью updateAfterEvent можно очень сильно поднять FPS, но это настолько сильно загрузит всю систему, что перестанет опрашиваться управление. Примерно так - обновление логики и экрана повесить на таймер с минимальным интервалом и одним повторением, в конце вызываемой функции перезапустить таймер и только тогда updateAfterEvent.
Чтобы понять проблему с точностью таймеров во Flash, можно запустить глухой цикл вывода текущего времени в лог. Последний раз редактировалось VVall; 21.08.2009 в 20:36. Причина: typo |
|
|||||
Вопрос, как это реализовать? Т.е. у меня есть движущийся спрайт, как за ним оставить шлейф так, чтобы не потерять производительность?
|
|
|||||
Регистрация: Jan 2009
Сообщений: 1,651
|
Ну тут уж выбирать. Или производительность, или дублировать на задний слой объект с блуром.
|
Часовой пояс GMT +4, время: 12:48. |
|
« Предыдущая тема | Следующая тема » |
|
|