Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Интервал таймера зависит от fps (http://www.flasher.ru/forum/showthread.php?t=140181)

medvedya2 22.05.2010 15:07

Интервал таймера зависит от fps
 
Делаю игру есть главный таймер на 10мс , он запускает функции в объектах и передаёт им количества выполнения таймера в объектах через остаток от деления(%)
if (количества выполнения таймера%число==0) выполняю действия.
так вот, почему то чем больше fps тем чащи выполняют действия объекты.
как сделать нормальный таймер, чтоб он не зависел от fps?

VVall 22.05.2010 15:10

Точность таймеров зависит от FPS, такая особенность Flash. Но 10 мс - недостижимая для него точность в любом случае.

medvedya2 22.05.2010 16:11

жаль, значить во флеши невозможно сделать игру в реальном времени :(

enepx 22.05.2010 16:40

Цитата:

Сообщение от medvedya2 (Сообщение 910144)
жаль, значить во флеши невозможно сделать игру в реальном времени :(

К счастью, с реакцией человека реальность достигается уже при шаге 1000 / 30 = 33мсек :quiet:

Wolsh 22.05.2010 16:51

Глупый вопрос - а ты updateAfterEvent делаешь?

medvedya2 22.05.2010 17:31

Цитата:

Сообщение от Wolsh (Сообщение 910157)
Глупый вопрос - а ты updateAfterEvent делаешь?

Нет, добавляет тормоза, и смысла в нём не вижу

Добавлено через 5 минут
пришлось сделать таймер на 20ms, и 50fps.
на очень слабых компах игра будет работать медленней? или только прорисовка реже?

enepx 22.05.2010 17:43

Таймер не зависит от скорости компьютера и/или его загруженности. Только прорисовка.

wvxvw 22.05.2010 19:29

Есть еще такой момент, что таймер не может случится чаще чем 10 раз за кадр, ну и чем выше FPS, тем таймер точнее. Но, в любом случае, если точность важна, то нужно корректировать по getTimer / Date.

Psycho Tiger 22.05.2010 19:39

wvxvw, а что, getTimer() стал мегаточным? =)

iNils 22.05.2010 20:55

Цитата:

Сообщение от Psycho Tiger (Сообщение 910194)
wvxvw, а что, getTimer() стал мегаточным? =)

А что, он не был точным?

i.o. 22.05.2010 21:06

getTimer() точнее, чем Date.time

Psycho Tiger 22.05.2010 21:29

Разве он намного точнее, чем Timer?

iNils 22.05.2010 22:04

Цитата:

Сообщение от Psycho Tiger (Сообщение 910215)
Разве он намного точнее, чем Timer?

Летело две вороны, одна черная, другая налево.
getTimer показывает время с момента запуска флешки, а Timer вызывает события с заданным интервалом, и вот эти вызовы неточные.

Psycho Tiger 22.05.2010 22:32

Вызывая getTimer я не считаю, что он мне покажет точное время с момента запуска флешки, будет погрешность + - сколько-то. Выравниваясь по getTimer мы всё равно накопим погрешность, которая, по моему мнению, ни на чем не основанном, будет примерно таким же, как при вызовах хендлеров от Timer.

i.o., а почему получая системное время мы получаем его менее точным, чем getTimer?

iNils 22.05.2010 23:28

Цитата:

Вызывая getTimer я не считаю, что он мне покажет точное время с момента запуска флешки, будет погрешность + - сколько-то.
Откуда такие мысли?

Psycho Tiger 23.05.2010 00:12

Цитата:

Сообщение от iNils (Сообщение 910237)
Откуда такие мысли?

Методом от противного. Если можно точно определить текущее время со старта флешки, то, наверное, можно и достаточно точно запускать любого рода таймауты. getTimer() + delay. Короче, если в любой момент времени можно получить реальное время после запуски флешки, то я не вижу реальных преград для создания сверхточных таймеров и всякой такой бурды.

Другое дело, если адоубовцы пошли для таймеров каким то другим путём, например, для производительности, но эти факты мне уже неизвестны. Но как то всё это... не могу знать, что они там мудрят.

Поэтому я исхожу из того, что предыдущая предпосылка неверна, а значит и у getTimer`а есть погрешности.

Кстати, я бы слепо верил в то, что getTimer это банальная субстракция текущего системного времени - время старта флешки, однако
Цитата:

getTimer() точнее, чем Date.time
Короче говоря, у меня одни догадки. iNils, ты уверен что getTimer очень точный - насколько вообще можно быть точным в фп?

iNils 23.05.2010 00:27

getTimer работает просто: При старте флешки, берется системное время. При вызове getTimer берется еще одно время, разница и есть время работы. То есть время берется в момент вызова getTimer. Откуда тут погрешность?
А интервалы срабатывают в "окне" между выполнением кода.
Допустим есть такой код
Код AS3:

private function init (event:Event):void {
        var t:Timer = new Timer (10, 20);
        t.addEventListener (TimerEvent.TIMER, onT);
        t.start ();
        trace ();
        a ()
        trace ();
}
 
private function a ():void {
        for (var i:int = 0; i < 1000000; i++) {
                var t:int = getTimer ();
        }
}
private function onT (event:TimerEvent):void {
        trace ("timer");
}

Пусть он выполняется 100 миллисекунд. И в течении всех миллионов раз запуска, getTimer будет меняться. Вопрос: ты реально думаешь, что таймер вызовет обработчик события 10 раз пока выполняется метод "а", то есть в середине выполнения метода или же дождется его окончание, тем самым сдвинув вызов первого интервала на 100 мс?

Psycho Tiger 23.05.2010 00:51

Черт. У нас же один поток... Да, ты прав.
Но мне все ещё неясны слова i.o. -
Цитата:

getTimer() точнее, чем Date.time

Obi 23.05.2010 01:11

Простите что вклиниваюсь, на правах вечера субботы: а что вам мешает использовать Date.getTime()? По-моему точнее не придумать.

medvedya2 23.05.2010 02:39

Цитата:

Сообщение от enepx (Сообщение 910169)
Таймер не зависит от скорости компьютера и/или его загруженности. Только прорисовка.

Провёл тесты, если много прорисовки то таймер начинает тормозить, как будто прорисовка и таймер находятся в одном потоке, то есть выполняется таймер и следующий шаг таймера не может выполнится пока не пройдет прорисовка кадра.
видимо разработчикам флеша было впадлу реализовать таймер отдельно и они его на самом AS3 и написали за основу взяли ENTER_FRAME.

i.o. 23.05.2010 02:50

Psycho Tiger, не переживай ты так, сейчас найду эту тему..))

BlooDHounD 23.05.2010 02:53

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

Добавлено через 1 минуту
но погрешности getTimer и класса Timer между собой никак не связанны.

i.o. 23.05.2010 02:58

Может я и ошибаюсь, что getTimer() точнее Date.time. Но в общем там постоянно есть погрешность между ними.
Пост номер 3 из этой темы http://www.flasher.ru/forum/showthread.php?t=133807
Просто автор в самом начале жалуется на постоянную разницу в измерениях, используя Date.time.


Ну или вот такой вариант:
Код AS3:

 
stage.addEventListener( MouseEvent.CLICK, _onMClick );
 
 
 
function _onMClick( e:MouseEvent ):void
{
        for( var i:int=0; i<2048; i++ )
        {
                trace( getTimer() );
                trace( (new Date()).time );
                trace();
        }
 
}

А вот результат (там где многоточие - убраны повторяющиеся значения):
Цитата:

668
1274565831593

669
1274565831593

....

669
1274565831609

670
1274565831609

....

671
1274565831609

....

672
1274565831609

....

673
1274565831609

....
....

686
1274565831625
Как видно, Date.time показывает полную чушь (в смысле с большой погрешностью), в то время, как getTimer() примерно через одинаковое количество трэйсов увеличивается на единичку

BlooDHounD 23.05.2010 03:09

Date точнее, так как он зависит от системных часов. а getTimer зависит от процессора.

i.o. 23.05.2010 03:14

BlooDHounD, прокомментируйте пост выше (обновлен).
Если вы правы, то приведите подтверждающий пример.

BlooDHounD 23.05.2010 04:19

лично меня не волнует, то что Date обновляет своё значение не мгновенно. главное, что через 5 минут работы приложения, он отстаёт всего на 5 мс, а не 40 сек. а запрашивать время дважды в одной функции я ни разу даже не додумался =)

для тестов скорости точности getTimer хватает. а для релтайм игры его погрешность на длинных дистанциях меня не устраивает.

i.o. 23.05.2010 07:04

Да, на длинных дистанциях Date лучше, без вопросов.
Правда есть один маловероятный ньюанс: пользователь может перевести время или например переход на летнее и обратно...))

iNils 23.05.2010 12:27

BlooDHounD
1. Как вы поняли, что это getTimer?
2. Какая величина погрешности.
3. Эта погрешность накапливается?

BlooDHounD 23.05.2010 13:28

1. случайно. что-то врало и мы не могли понять что. предположили самое невероятное и написали тест, который показывал разницу Date и getTimer. их дельта не уклонима росла со временем.
2. на всех компах была разная
3. да

с тех пор вместо flash.utils.getTimer для синхронизации используется такой такой неказистый код:
Код AS3:

package blooddy.utils {
 
        /**
        * @author                                        BlooDHounD
        * @version                                        1.0
        * @playerversion                        Flash 10
        * @langversion                                3.0
        */

        public function getTimer():Number {
                return ( new Date() ).getTime() - startTime;
        }
 
}
 
import flash.utils.getTimer;
 
/**
 * @private
 */

internal const startTime:Number = ( new Date() ).getTime() - flash.utils.getTimer()


iNils 23.05.2010 13:43

Написал свой тест. Результат совсем другой. Погрешность есть, колебалась в диапазоне -7..7 мс без нагрузки и с нагрузкой в 1000000 итераций простого цикла. С 10000000 колебания были -14..0 мс. Накопления не обнаружил.

BlooDHounD 23.05.2010 13:52

iNils, я тебе ещё раз повторяю. на всех компах рассинхронизация вела себя по разному. реально заметно становилось после 5ти минут игры. у кого-то не становилось.

Psycho Tiger 23.05.2010 13:52

Давайте тогда оба теста в студию.

BlooDHounD 23.05.2010 13:59

какие оба теста?

etc 23.05.2010 14:04

Вложений: 1
Цитата:

Сообщение от iNils (Сообщение 910327)
BlooDHounD
1. Как вы поняли, что это getTimer?
2. Какая величина погрешности.
3. Эта погрешность накапливается?

1. Длительными тестами;
2. До 1 секунды, в зависимости от архитектуры и ОС;
3. Накапливается.

Вообще говоря, если не лень регистрироваться, то можно посмотреть в Destiny по шоткату Ctrl+Alt+F (в третьей строчке инфы в самом конце показана дельта между getTimer() и Date). На Mac OS дельта всегда ноль, на XP и Vista плавает регулярно туда-сюда.

iNils 23.05.2010 14:50

Цитата:

Сообщение от BlooDHounD (Сообщение 910341)
какие оба теста?

Давайте ваш.

i.o. 23.05.2010 23:25

Выложу тест первый:
Код AS3:

import flash.events.Event;
 
 
var _stTm_getTimer:uint = getTimer();
var _stTm_dateTime:Number = (new Date()).time;
 
var _minDelta:int = 0;
var _maxDelta:int = 0;
 
 
addEventListener( Event.ENTER_FRAME, OEF );
 
 
 
function OEF( e:Event ):void
{
        var _gt:uint = getTimer();
        var _dt:Number = (new Date()).time;
 
        var _dltGt:uint = (_gt - _stTm_getTimer);
        var _dltDt:Number = (_dt - _stTm_dateTime);
 
        var _delta:int = uint(_dltGt) - _dltDt;
 
        if( _minDelta > _delta )
                _minDelta = _delta;
 
        if( _maxDelta < _delta )
                _maxDelta = _delta;       
 
        txt_out.text =        "getTimer(): " + _gt + "\n" +
                                        "Date.time:  " + _dt + "\n" +
                                        "\n" +
                                        "delta getTimer(): " + _dltGt + "\n" +
                                        "delta Date.time:  " + _dltDt + "\n" +
                                        "\n" +
                                        "DELTA getTimer() - Date.time: " + _delta + "\n" +
                                        "\n" +
                                        "min DELTA: " + _minDelta + "\n" +
                                        "max DELTA: " + _maxDelta + "\n";
}

Согласно BloodHound, min DELTA или max DELTA со временем постоянно увеличивалась бы. У меня такого не происходит. Пробовал систему нагружать 3dmark'ом 2005 - ничего не изменилось (дельты остались на прежнем уровне).
WinXP x64.

BlooDHounD 24.05.2010 04:26

верить мне или нет - ваше право.

etc 24.05.2010 07:51

Тесты, в которых приложение только и занимается тем, что выводит дельту, что-либо увидеть невозможно. Если бы это было приложение, которое выгружает и загружает десятки мегабайт графики, что-то рендерит и т. п., то результат себя бы долго не заставил ждать. У нас уже через час работы рассинхронизация достигала пары секунд на некоторых машинах.


Часовой пояс GMT +4, время: 00:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.