Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.12.2009, 18:11
Cloun вне форума Посмотреть профиль Отправить личное сообщение для Cloun Найти все сообщения от Cloun
  № 1  
Ответить с цитированием
Cloun

Регистрация: Dec 2009
Сообщений: 2
По умолчанию Погрешность измерения времени

Добрый день.
Хотел узнать, может быть кто-то сталкивался с подобной погрешности измерения времени?
Суть дела:
у меня есть сервер написанные .net, ну и клиент на Flex (as3 SDK 3.4.1). Взаимодействия осуществляется на socket. Сейчас я испытываю локальную версию. Т.е. все строго на localhost.
Каждая команда (кроме команды начала игры) содержит интервал времени с момента начала игры (на клиенте) до момента возникновения игрового события (которое и привело к возникновению команды) в миллисекундах.
Действует это так: сервер посылает команду "игра началась". Клиент, получивший команду запоминает момент времени когда он получил команду:
Код AS3:
var startTime: Number = new Date().time;
Потом клиент шлет команды, вычисляет интервал между этим временем и временем возникновения команды:
Код AS3:
var commandTime: Number = new Date().time - startTime;
Сервер тоже, делает такие же вычисления у себя (c#):
Код:
startTime = DateTime.Now;
long commandTime = (long) ((DateTime.Now - startTime).TotalMilliseconds);
В результате у меня иногда получается так, что время команды (интервал от начала игры) на клиенте больше чем на сервере. Чего быть не может, учитывая что какие-то накладные расходы на создание и пересылку команд должны быть. И, в любом случае, интервалы могут быть равными, но никак не может быть, что клиентский был больше серверного.
Была у меня теория, что дело в округлении: в C# превращая double в long я делаю фактически floor, в AS3 может быть делается математическое округление..
Но при худшем стечении обстоятельств разница бы составляла 2 мс. Однажды у меня разница составила 10 мс, что разбило эту теорию.
Я понимаю, что между вычислением значения интервала и доставкой его на сервер множество кода, но, все трассируется, и я смотрю на величины в момент их вычисления, что исключается влияние ошибок передачи.
Есть у меня и другая теория, что проблема на стороне framework'ов. Либо Flash, либо .net framework...
Может кто-то сталкивался с подобным?

Старый 13.12.2009, 18:39
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну, добавьте туда еще и то, что во флеше Number - это число с плавающей точкой, поэтму любые вычисления с ним чреваты погрешностями... Я думаю, что если ошибка не накапливается, то наверняка это "так и должно быть", т.е. лучше не будет. И еще, я бы попробовал может передавать не полную дату а только, например дни и часы + все, что меньше - так можно было бы использовать uint вместо Number...
__________________
Hell is the possibility of sanity

Старый 14.12.2009, 03:28
GentleFLASH вне форума Посмотреть профиль Отправить личное сообщение для GentleFLASH Найти все сообщения от GentleFLASH
  № 3  
Ответить с цитированием
GentleFLASH

Регистрация: Apr 2009
Сообщений: 117
Возможно стоит попробовать getTimer() - встроеная функция, возвращает кол-во миллисекунд прошедших с момента запуска флэшки. Вдруг точнее будет.

Весьма интересные результаты получились. Иногда разница между измерениями через getTimer и Date лежит от -15 до 0, иногда от -8 до 6, а иногда от 0 до 15. Кому интересно:

Код AS3:
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.
Старый 14.12.2009, 11:39
Cloun вне форума Посмотреть профиль Отправить личное сообщение для Cloun Найти все сообщения от Cloun
  № 4  
Ответить с цитированием
Cloun

Регистрация: Dec 2009
Сообщений: 2
Спасибо всем за советы! Попробую getTimer...
Любопытно, что вернет эта функция спустя 24,8 дней после запуска приложения =)


Последний раз редактировалось Cloun; 14.12.2009 в 11:48. Причина: Добавил
Старый 15.12.2009, 20:52
incoob вне форума Посмотреть профиль Отправить личное сообщение для incoob Найти все сообщения от incoob
  № 5  
Ответить с цитированием
incoob

Регистрация: Mar 2008
Сообщений: 215
Во флеше таймеры работают с погрешностью. Вроде с погрешностью работает и getTimer.
Поищите на форуме, эта тема не так давно активно обсуждалась...

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
Date Time counting

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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