![]() |
Интервал таймера зависит от fps
Делаю игру есть главный таймер на 10мс , он запускает функции в объектах и передаёт им количества выполнения таймера в объектах через остаток от деления(%)
if (количества выполнения таймера%число==0) выполняю действия. так вот, почему то чем больше fps тем чащи выполняют действия объекты. как сделать нормальный таймер, чтоб он не зависел от fps? |
Точность таймеров зависит от FPS, такая особенность Flash. Но 10 мс - недостижимая для него точность в любом случае.
|
жаль, значить во флеши невозможно сделать игру в реальном времени :(
|
Цитата:
|
Глупый вопрос - а ты updateAfterEvent делаешь?
|
Цитата:
Добавлено через 5 минут пришлось сделать таймер на 20ms, и 50fps. на очень слабых компах игра будет работать медленней? или только прорисовка реже? |
Таймер не зависит от скорости компьютера и/или его загруженности. Только прорисовка.
|
Есть еще такой момент, что таймер не может случится чаще чем 10 раз за кадр, ну и чем выше FPS, тем таймер точнее. Но, в любом случае, если точность важна, то нужно корректировать по getTimer / Date.
|
wvxvw, а что, getTimer() стал мегаточным? =)
|
Цитата:
|
getTimer() точнее, чем Date.time
|
Разве он намного точнее, чем Timer?
|
Цитата:
getTimer показывает время с момента запуска флешки, а Timer вызывает события с заданным интервалом, и вот эти вызовы неточные. |
Вызывая getTimer я не считаю, что он мне покажет точное время с момента запуска флешки, будет погрешность + - сколько-то. Выравниваясь по getTimer мы всё равно накопим погрешность, которая, по моему мнению, ни на чем не основанном, будет примерно таким же, как при вызовах хендлеров от Timer.
i.o., а почему получая системное время мы получаем его менее точным, чем getTimer? |
Цитата:
|
Цитата:
Другое дело, если адоубовцы пошли для таймеров каким то другим путём, например, для производительности, но эти факты мне уже неизвестны. Но как то всё это... не могу знать, что они там мудрят. Поэтому я исхожу из того, что предыдущая предпосылка неверна, а значит и у getTimer`а есть погрешности. Кстати, я бы слепо верил в то, что getTimer это банальная субстракция текущего системного времени - время старта флешки, однако Цитата:
|
getTimer работает просто: При старте флешки, берется системное время. При вызове getTimer берется еще одно время, разница и есть время работы. То есть время берется в момент вызова getTimer. Откуда тут погрешность?
А интервалы срабатывают в "окне" между выполнением кода. Допустим есть такой код Код AS3:
|
Черт. У нас же один поток... Да, ты прав.
Но мне все ещё неясны слова i.o. - Цитата:
|
Простите что вклиниваюсь, на правах вечера субботы: а что вам мешает использовать Date.getTime()? По-моему точнее не придумать.
|
Цитата:
видимо разработчикам флеша было впадлу реализовать таймер отдельно и они его на самом AS3 и написали за основу взяли ENTER_FRAME. |
Psycho Tiger, не переживай ты так, сейчас найду эту тему..))
|
результат getTimer зависит от архитектуры процессора. проверенный факт. когда я работал в TZ, у нас при разработки Desteny возникла проблема, которую мы не могли решить. на getTimer подумали в последнею очередь. оказалось, что на всех машинах он давал разную погрешность. где-то отставал, где-то спешил. точно работал только на Денискином ноуте. в итоге мы написали свой getTimer() с блэкджеком и сопутствующими ингредиентами.
Добавлено через 1 минуту но погрешности getTimer и класса Timer между собой никак не связанны. |
Может я и ошибаюсь, что getTimer() точнее Date.time. Но в общем там постоянно есть погрешность между ними.
Пост номер 3 из этой темы http://www.flasher.ru/forum/showthread.php?t=133807 Просто автор в самом начале жалуется на постоянную разницу в измерениях, используя Date.time. Ну или вот такой вариант: Код AS3:
Цитата:
|
Date точнее, так как он зависит от системных часов. а getTimer зависит от процессора.
|
BlooDHounD, прокомментируйте пост выше (обновлен).
Если вы правы, то приведите подтверждающий пример. |
лично меня не волнует, то что Date обновляет своё значение не мгновенно. главное, что через 5 минут работы приложения, он отстаёт всего на 5 мс, а не 40 сек. а запрашивать время дважды в одной функции я ни разу даже не додумался =)
для тестов скорости точности getTimer хватает. а для релтайм игры его погрешность на длинных дистанциях меня не устраивает. |
Да, на длинных дистанциях Date лучше, без вопросов.
Правда есть один маловероятный ньюанс: пользователь может перевести время или например переход на летнее и обратно...)) |
BlooDHounD
1. Как вы поняли, что это getTimer? 2. Какая величина погрешности. 3. Эта погрешность накапливается? |
1. случайно. что-то врало и мы не могли понять что. предположили самое невероятное и написали тест, который показывал разницу Date и getTimer. их дельта не уклонима росла со временем.
2. на всех компах была разная 3. да с тех пор вместо flash.utils.getTimer для синхронизации используется такой такой неказистый код: Код AS3:
|
Написал свой тест. Результат совсем другой. Погрешность есть, колебалась в диапазоне -7..7 мс без нагрузки и с нагрузкой в 1000000 итераций простого цикла. С 10000000 колебания были -14..0 мс. Накопления не обнаружил.
|
iNils, я тебе ещё раз повторяю. на всех компах рассинхронизация вела себя по разному. реально заметно становилось после 5ти минут игры. у кого-то не становилось.
|
Давайте тогда оба теста в студию.
|
какие оба теста?
|
Вложений: 1
Цитата:
2. До 1 секунды, в зависимости от архитектуры и ОС; 3. Накапливается. Вообще говоря, если не лень регистрироваться, то можно посмотреть в Destiny по шоткату Ctrl+Alt+F (в третьей строчке инфы в самом конце показана дельта между getTimer() и Date). На Mac OS дельта всегда ноль, на XP и Vista плавает регулярно туда-сюда. |
Цитата:
|
Выложу тест первый:
Код AS3:
WinXP x64. |
верить мне или нет - ваше право.
|
Тесты, в которых приложение только и занимается тем, что выводит дельту, что-либо увидеть невозможно. Если бы это было приложение, которое выгружает и загружает десятки мегабайт графики, что-то рендерит и т. п., то результат себя бы долго не заставил ждать. У нас уже через час работы рассинхронизация достигала пары секунд на некоторых машинах.
|
| Часовой пояс GMT +4, время: 00:12. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.