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

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

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

Регистрация: Apr 2009
Сообщений: 409
По умолчанию Синхронизация времени

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

Код AS3:
		private static function tick(t:TimerEvent = null) {
			_now = new Date().getTime() + timeDiff; 
			sendEvent(CLOCK.TICK, now);
		}
В теории все должно работать правильно, и время на клиенте всегда должно отставать от серверного на пару секунд. Но на практике время иногда отстает больше чем на минуту, а у некоторых даже обгоняет серверное. Приходится каждую минуту сверяться (при учете пинга). Для меня это большая загадка, если учесть что все обращения ко времени идут после события TICK, и оно на клиенте не может постоянно плавать без перевода часов. Кто сталкивался с подобной проблемой, и есть ли какое-то объяснение и решение?

Старый 10.09.2016, 19:12
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 2  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
флэшка в браузере или на девайсе?Если второе - таймер может засыпать.

Добавлено через 5 минут
upd: чтоб не зависить от дат лучше использовать
время со старта AVM

Старый 10.09.2016, 19:27
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 3  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
В браузере, на случай засыпания по идее засыпает и диспетчер)
А разве getTime() работает не по тому же принципу, только за 0 берется запуск? это бы было слишком просто)

Старый 10.09.2016, 19:41
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 4  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
в браузере вроде таймеры не должны засыпать.GetTimer привязан к системным часам и к таймерам отношения не имеет.
Естественно часы не останавлиаются никогда.

Добавлено через 7 минут
upd:хотя да что getTimer,что new Date().getTime()+delta должны давать одинаковые результаты.
Еще вариант если используется что-то типа aws(amazon web services) и бэкенд крутится на нескольких инстансах.Серверное время на разных инстансах может отличаться на 2-3 минуты в любую сторону и не определишь на какой из инстансов придет запрос.Мы недавно на такую граблю наступили.Решили синхронизацией часов инстансов по хрону раз в сутки.
PS:А зачем нужно на клиенте иметь точное серверное время?

Добавлено через 13 минут
Цитата:
на случай засыпания по идее засыпает и диспетчер)
А вот не факт enter_frame, например, засыпает не полностью, а fps просто опускается до 2-3.Возможно и таймер кое-как продолжает тикать.Но это все маловероятно т.к., повторю, эти костыли были введены для экономии батарейки, на десктопе оно ни к чему.


Последний раз редактировалось undefined; 10.09.2016 в 19:56.
Старый 10.09.2016, 22:14
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 5  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
Проверил, к сожалению с getTime результат тот же, время во время одной сессии скачет то в плюс то в минус на 3-10 секунд, единсвтенное теперь не реагирует на перевод часов, и его можно исключить как причину.
Цитата:
:А зачем нужно на клиенте иметь точное серверное время?
Все данные с сервера приходят в нем, удобно все таймеры на клиенте разворачивать тоже с ним.

Старый 11.09.2016, 15:26
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 6  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
При запросе времени с сервера, сохраняете его время на момент запроса (getTimer).
Далее просто создаёте функцию, которая будет возвращать актуальное время:
Код AS3:
var serverTime:Number;
var synchronizationDate:int;
 
/// Время сервера должно передаваться в миллисекундах.
function synchronize(time:Number):void {
    serverTime = time;
    synchronizationDate = getTimer();
}
/// Возвращает текущее время сервера в миллисекундах.
function getActualTime():Number{
    return (getTimer() - synchronizationDate) + serverTime;
}
__________________
Дети не должны знать о своих родителях

Старый 12.09.2016, 15:43
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 7  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
так оно и работает, но проблема в том что скачет время на клиенте

Старый 12.09.2016, 15:49
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 8  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
так сделай постоянный запрос точного времени с сервера по таймеру и смотри в какой момент расхождение начинается.Или оно только в проде воспроизводится?

Старый 12.09.2016, 20:27
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 9  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
только у других, чек и так идет каждую минуту, так вот за нее время может и просесть на 10-20 сек, магия)

Старый 13.09.2016, 09:45
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 10  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
faraday,
Ещё раз посмотрите пример кода, который я привёл. Там нету тикания таймера и нет никаких расхождений.
__________________
Дети не должны знать о своих родителях

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

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

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


 


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


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