Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   RTT, Latency и другие (http://www.flasher.ru/forum/showthread.php?t=143035)

Crenth 05.08.2010 16:39

RTT, Latency и другие
 
Есть реалтайм игра. Я не знаю деталей. Моя задача - серверная часть.

На клиенте и на сервере есть часто выполняемые участки кода, ответственные за обмен данными и актуализацию.
Каждый участок кода может выполняться в течение различного времени. Время выполнения зависит от возможностей и загрузки клиентского компа и загрузки сервера.
(Latency)

Кроме того пакеты летают от сервера к клиенту и обратно также всегда с различной скоростью. Которая также зависит от загрузки канала у клиента и у сервера Round-trip-time RTT)

Задача состоит в том, чтобы в определенные моменты времени приблизительно точно знать:
- время доставки пакета от сервера к клиенту
- время доставки пакета от клиента к серверу
- время, затрачиваемое обоими на обработку пакета
( Latency обеих сторон, RTT down и up)
Задача простая вроде бы. Но решение осложняется тем, что решить задачу нужно на серверной стороне.

На сервере есть доступ ко всей инфе, которую способно дать ядро Linux.
На клиенте - как обычно (netstream.info и иже с ним)

Третий день туплю - не знаю, с какой стороны подойти.

С газелями как то проще :)

maxlapshin 13.08.2010 15:22

А что мешает написать код, который будет слать на клиента сообщение с текущим временем, после чего получать его обратно и сравнивать?

Crenth 20.08.2010 10:30

Решение оказалось до безобразия простым!
Самое замечательное в том, что синхронизация таймеров сервера и клиента происходит за один шаг, без лишнего обмена данными и самое главное - с точностью до 1 мсек.
Я доволен :)

Котяра 20.08.2010 13:14

и? где решение то?))
Колись уж давай.

Crenth 20.08.2010 20:55

Код AS3:

var stream:Object = new Object();
var LocalTime:Date = new Date();
stream.LOCALTIME = LocalTime.time.toString();
myStream.play(stream);

Задержки на сервере или на клиенте, связанные с выполнением фрагментов кода, исчисляются микросекундами. Поэтому ими пренебрегаем.
FP при отсчете timestamp чанков принимает за НОЛЬ момент вызова метода NetConnection.Connect.
Далее в каждом чанке timestamp равен разнице во времени между НОЛЕМ и моментом формирования чанка.
Network Latency измеряем в самом начале коннекта, когда в обе стороны идет обмен пакетами, превышающими TCP MSS.
Вызов myStream.play(stream) передает локальное время клиента. На сервере сравниваем chunk timestamp и значение LOCALTIME.VALUE, по которому можно вычислить момент начала сеанса.
Далее зная NetLatency вычисляем расхождение Tdelta между часами сервера и клиента.
Если прибавить Tdelta к timestamp чанка, получаем точное время отправки чанка от клиента на сервер.
Дальше не имеет значения как будет меняться NetLatency, поскольку каждый прибывший на сервер пакет имеет timestamp - время отправки.

Таким образом мы будем знать время отправки каждого чанка по серверным часам. А если засечь время прибытия чанка, можно в каждый момент времени знать BDP

[IMG]http://img44.**************/img44/5671/timelineb.jpg[/IMG]

Crenth 27.08.2010 16:42

Цитата:

Сообщение от Котяра (Сообщение 930130)
и? где решение то?))
Колись уж давай.

не впечатлило ?
или нужны пояснения ? :)

maxlapshin 28.08.2010 03:30

Цитата:

Сообщение от Crenth (Сообщение 930264)
FP при отсчете timestamp чанков принимает за НОЛЬ момент вызова метода NetConnection.Connect.
Далее в каждом чанке timestamp равен разнице во времени между НОЛЕМ и моментом формирования чанка.

Вообще, уже это неверно. Таймстемпы в RTMP не обязаны быть монотонно возрастающими по всем потокам, начиная с нуля.

Crenth 29.08.2010 03:14

не обязаны.
но когда мы говорим о синхронизации для целей реалтайм игры, то будут

maxlapshin 29.08.2010 07:30

А, я тебя кажется понял. Ты хочешь ориентироваться по NetStream.time?
Если так, то проверь хорошенько. Не знаю как у тебя будет, но использовать его для того, что бы узнать, что именно сейчас играет на видео, невозможно. audioBytes гораздо точнее.

Crenth 30.08.2010 17:56

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


Проблема русскоязычных форумов: не с кем обсудить фундаментальные вопросы. Либо потому, что знающие предпочитают держать при себе добытые потом знания, либо потому, что никто глубоко не копает.
В любом случае не гут.


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

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