-
Bad Santa
Re: Внимание, разработчики: обход сетевых лагов!!!
Вот, нашел таки.
================ CUT =================
Синхронизация времен клиентов в сервере WarBirds
Как это осуществляется?
На сервере есть свое системное время, счетчик системного времени который увеличивается на 1 единицу каждую миллисикунду. Считаем это серверное время, в котором существуют все остальные клиенты. У каждого клиента есть свой счетчик, который так же синхронно (более менее) изменяется на 1 единицу каждую миллисикунду. Задача синхронизации - перенести все клиентские счетчики в одну систему координат. В сисиему координат серверного времени. Для этого каждый клиент один раз в 500 мс посылает серверу пакет, в одном из полей которого как раз и записывается текущее показание счетчика этого клиента. Вреия доставки пакета от клиента к серверу может меняться от десятков до тысяч единиц. Поэтому при передаче информации от сервера к клиенту все местоположения других игроков должны быть скорректированы.
Как это выполнить?
При поступлении пакета от клиента к серверу, происходит вычисление разницы между текущим серверным временем (время когда был принят пакет) и тем показанием которое хранится в пакете клиента. Происходит вычисление коэффициента, который будет согласовывающей величиной между клиентским временем и временем сервера.
Tserver = Tclient + Kclient.
Tserver текущее время сервера.
Tclient время клиента указанное в пакете.
Kclient поправочный коэффициент.
Эта величина K для каждого клиента своя.
Теперь как формировать пакет местоположения каждого клиента?
Предположим ко времени формирования этого пакета пришли информации от N клиентов. У всех из них есть N коэффициентов и у все из них N своих внутренних "времен". Для каждого клиента поправочный коэффициент (время от настоящего момента до того времени когда был получен последний пакет с координатами и указанным в этом пакете внутренним временем клиента) будет раваен:
Tadjust = Tnow_server-Tclient-Kclient.
Tadjust поправочный коэффициент который передается в пакете местоположения.
Tnow_server время в кторое формирутеся пакет местоположения для всех клиентов.
Tclient время указанное в пакете клиента (тот что пришел от клиента).
Kclient коэффициент ссответствия серверного и клиентского времени.
Как вычисляется K?
Берется последние 20 пакетов (10 секунд) и происходит нахождение согласовывающего коэффициента по формуле для каждого из пакетов:
Kclient=Tserver-Tclient
Среди этих коэффициентов выбирается минимальный по значению. Надо сказать что Tclient величина дискретно изменяющаяся и кратно 500 (или близка к этому) А величина Tserver вероятностная и зависит от качества линии связи. Время в которое сервер ПРИНЯЛ сигнал от клиента и есть то время Tserver
Пример когда Tserer < Tclient:
Tser[0] = 10
Tclient[0] = 20
K[0] = 10-20 = -10
Tser[1] = 16 +6
Tclient[1] = 25
K[1] = 16-25 = -11
Tser[2] = 21 +5
Tclient[2] = 30
K[2] = 21-30 = -9
Tser[3] = 27 +6
Tclient[3] = 35
K[3] = 27-35 = -8
Tser[4] = 29 +3
Tclient[4] = 40
K[4] = 29-40 = -11
Tser[5] = 32 +3
Tclient[4] = 45
K[5] = 32-45 = -13 /* это наилучший вариант */
Здесь запоминаем коэфициент = -13
Пример когда Tserer > Tclient:
Tser[0] = 30
Tclient[0] = 20
K[0] = 30-20 = 10
Tser[1] = 36
Tclient[1] = 25
K[1] = 36-25 = 11
Tser[2] = 39
Tclient[2] = 30
K[2] = 39-30 = 9
Tser[3] = 43
Tclient[3] = 35
K[3] = 43-35 = 8 /* наменьшее время, наилучший вариант */
Tser[4] = 53
Tclient[4] = 40
K[4] = 53-40 = 13 /* варп */
Здесь запоминаем коэфициент = 8
Анализ минимального коэффициента происходит 1 раз в секунду И минимальный коэффициент в лучшем случае держится 20 сек, в худшем 1 сек.
Далее после нахождения уравнивающего коэффициента для каждого клиента мы можем формировать пакеты положения клиентов в одном временном пространстве. Правда где то в связи с нетлагом будут сдвиги но в целом это позволит избежать нежелательного "подрагивания" самолетов на близком расстоянии. Данной системой синхронизации мы добиваемся исключения микроварпов.
=================== CUT ===================
Ho, ho, ho, ho, ho! Let's see who's been naughty, and who's been naughty.

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