![]() |
|
||||||||||
|
|||||
|
Регистрация: Dec 2009
Сообщений: 2
|
Добрый день.
Хотел узнать, может быть кто-то сталкивался с подобной погрешности измерения времени? Суть дела: у меня есть сервер написанные .net, ну и клиент на Flex (as3 SDK 3.4.1). Взаимодействия осуществляется на socket. Сейчас я испытываю локальную версию. Т.е. все строго на localhost. Каждая команда (кроме команды начала игры) содержит интервал времени с момента начала игры (на клиенте) до момента возникновения игрового события (которое и привело к возникновению команды) в миллисекундах. Действует это так: сервер посылает команду "игра началась". Клиент, получивший команду запоминает момент времени когда он получил команду: Потом клиент шлет команды, вычисляет интервал между этим временем и временем возникновения команды: Сервер тоже, делает такие же вычисления у себя (c#): startTime = DateTime.Now; long commandTime = (long) ((DateTime.Now - startTime).TotalMilliseconds); Была у меня теория, что дело в округлении: в C# превращая double в long я делаю фактически floor, в AS3 может быть делается математическое округление.. Но при худшем стечении обстоятельств разница бы составляла 2 мс. Однажды у меня разница составила 10 мс, что разбило эту теорию. Я понимаю, что между вычислением значения интервала и доставкой его на сервер множество кода, но, все трассируется, и я смотрю на величины в момент их вычисления, что исключается влияние ошибок передачи. Есть у меня и другая теория, что проблема на стороне framework'ов. Либо Flash, либо .net framework... Может кто-то сталкивался с подобным? |
|
|||||
|
Modus ponens
|
Ну, добавьте туда еще и то, что во флеше Number - это число с плавающей точкой, поэтму любые вычисления с ним чреваты погрешностями... Я думаю, что если ошибка не накапливается, то наверняка это "так и должно быть", т.е. лучше не будет. И еще, я бы попробовал может передавать не полную дату а только, например дни и часы + все, что меньше - так можно было бы использовать uint вместо Number...
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 117
|
Возможно стоит попробовать getTimer() - встроеная функция, возвращает кол-во миллисекунд прошедших с момента запуска флэшки. Вдруг точнее будет.
Весьма интересные результаты получились. Иногда разница между измерениями через getTimer и Date лежит от -15 до 0, иногда от -8 до 6, а иногда от 0 до 15. Кому интересно: var dt_start:Number = (new Date()).time; var dt_delta:Number; var tm_start:uint = getTimer(); var tm_delta:uint; var i_dtCurr:int = 0; var i_dtMin:int = 0; var i_dtMax:int = 0; var i_cycles:int = 2048; stage.addEventListener( MouseEvent.CLICK, _onMClick ); function _onMClick( e:MouseEvent ):void { for( var i:int=0; i<i_cycles; i++ ) { dt_delta = (new Date()).time - dt_start; tm_delta = getTimer() - tm_start; i_dtCurr = tm_delta - dt_delta; i_dtMin = i_dtCurr < i_dtMin ? i_dtCurr : i_dtMin; i_dtMax = i_dtCurr > i_dtMax ? i_dtCurr : i_dtMax; } trace( "\n" ); trace( "deltaTimer: " + tm_delta ); trace( "deltaDate: " + dt_delta ); trace( "i_dtCurr: " + i_dtCurr ); trace( "i_dtMin: " + i_dtMin ); trace( "i_dtMax: " + i_dtMax ); } Последний раз редактировалось GentleFLASH; 14.12.2009 в 03:57. |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 2
|
Спасибо всем за советы! Попробую getTimer...
Любопытно, что вернет эта функция спустя 24,8 дней после запуска приложения =) Последний раз редактировалось Cloun; 14.12.2009 в 11:48. Причина: Добавил |
|
|||||
|
Регистрация: Mar 2008
Сообщений: 215
|
Во флеше таймеры работают с погрешностью. Вроде с погрешностью работает и getTimer.
Поищите на форуме, эта тема не так давно активно обсуждалась... |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:15. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| Date Time counting |
|
|