Войти
ПрограммированиеФорумСеть

Синхронизация клиентов через сервер...

Страницы: 1 2 Следующая »
#0
13:41, 3 июня 2010

Я уверен, что тем тут подобных было тысячи, но в  большинстве из них очень много флуда и конкретный ответ найти сложно :) Поэтому попробую описать свою проблему и надеюсь получить ответ =)

Вобщем дело вот какое, есть сервер, он принимает сообщения(действие, положение и тп) от клиентов и практически никакие действия с ними не производит, только отправляет это сообщение всем подключившимся клиентам. Те в свою очередь по полученным данным двигают других клиентов на свои места, но если передавать кординату допустим при отпускании клавиши движения(при нажатии передаем только действие движения) отправляем на сервер кординату конца движения + действие остановки, но из-за задержки игрок продолжает двигатся вперед + после получения действия обратно он резко возвращается на прошлую кординату...

Как можно синхронизировать? Я понимаю, что это вопрос не очень простой)) Но я хотел бы получить внятный ответ или ссылку на статью...

Еще я думал может как-либо предсказывать в какое возможно положение попадет игрок в связи с лагами(50-200 мс достаточно, игра реалтайм) после остановки... Но как это лучше всего выполнить?

Или может выполнять какие либо просчеты на сервере? А тупо передача данных между клиентом - сервер - все клиенты не очень хорошо? =)


#1
13:47, 3 июня 2010

Серверу и клиентам синхронизировать часы при коннекте.
Пакеты все подписывать временнЫми штампами.
По штампам вычислять в каждый момент времени кто где находится (с учётом прямолинейной скорости)
Рассинхронизация часов - подозрение на читы (но не уверенная гарантия поимки читера)

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

#2
14:06, 3 июня 2010

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

#3
16:29, 3 июня 2010

FDoKE
Думаю, что серверу не следует додумывать то, чего не существует, и то о чём сервер достоверно не знает.
Сервер передаёт всем, что игрок сообщил, что он начал двигаться.
А клиенты на местах уже изображают его на расстоянии от точки начала движения согласно пройденному времени и скорости.

#4
16:38, 3 июня 2010

А можно какой-нибудь пример подобной синхронизации? Работаю на C#(сервер)

#5
16:57, 3 июня 2010

Нету примера, но зато есть гугл.
Ищи по фразе "c# network multiplayer game synchronize"
Вот небольшое обсуждение по теме
http://stackoverflow.com/questions/1411745/multiplayer-game-synchronization

#6
18:04, 3 июня 2010

Угум посмотрю, спасибо, у гугла спрашивал нашел некую Асинхронную сихронизацию))) Она реализуется как вы сказали(там рассказывается что да как)

http://enepomnyaschih.livejournal.com/1610.html - вот статья

Ладно, думаю с синхранизацией справлюсь, но хочу спросить у знатаков C#, у меня сервак, в нем очень важно время отклика,

я для сервера использую протокол TCP

try {
  Server = new Socket( IPAddress.Loopback.AddressFamily , SocketType.Stream, ProtocolType.Tcp);
  Server.Bind(new IPEndPoint(IPAddress.Any, 9540));
  Server.Listen(10);
  Console.WriteLine("Server started!");
} catch (SocketException se) {
  Console.WriteLine(se.ErrorCode + ": " + se.Message);
}

Подключения ловлю циклом и создаю для подключения новый поток:

while (true) {
   Socket User = null;
   try {
         User = Server.Accept();
         UserDadaClient NewUser = new UserDadaClient();
         NewUser.StartUser(User);
   } catch {
      //Console.WriteLine("error");
    }
}

Насколько это хороший вариант? Просто проверял в локальной сетке данный сервер, задержка сильно прыгает.. Хотя возможно дело в самой локальной сетке(разбиение на сектора и тп) =)

#7
18:11, 3 июня 2010

FDoKE
Я как раз так же и делал,  (делал по туторам  )  . Только у меня на сишарпе клиент.

#8
18:30, 3 июня 2010

Ну тоесть ничего сверх ужасного в этом нет? =)  Я не делаю ничего категорически неправильного? Просто сервер пишу первый раз :) Еще обучаюсь C#))

Изначально сервер был на Java, но мне показалось, что на C# будет быстрее, ну или по крайней мере удобнее)) Насчет удобнее оказался прав, а насчет быстрее толком не разобрался =)

#9
19:00, 3 июня 2010

"быстрее"  уже не так актуально как раньше.  На первый план выходит надёжность и удобство (а значит и скорость разработки)

По критерию "неправильно"  судят если глючит, или тормозит.    У тебя ничего не глючит и не тормозит ?  Значит сделал правильно.

#10
19:32, 3 июня 2010

Да нет, вроде не глючит)) Единственно задержка какая-то странная.. Но думаю смогу это побороть придумав синхронизацию)) Всем спасибо за ответы, если вдруг вспомните про какую-либо статью буду рад ее прочитать =)

#11
0:27, 4 июня 2010

Небольшой вброс. Можно ли каким-то образом обойтись вообще без синхронизации? Например просто 30 раз/сек передавать координату? Что в таком случае грозит?

#12
1:04, 4 июня 2010

Machete
> Например просто 30 раз/сек передавать координату?
очевидно сервер может и должен : )

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

FDoKE
> Единственно задержка какая-то странная..
Нейгла отключать ещё не советовали? ; )

если клиент шлёт данные реже сервера, задержка, наведённая алгоритмами Нейгла и отложенного подтверждения, она может составлять 0.2 - 0.5 с

к тому ж в любом случае ТСР "паровозит" данные, то их нет, а то приходят сразу паровозиком : )

#13
2:31, 4 июня 2010

>Я уверен, что тем тут подобных было тысячи, но в большинстве из них очень много флуда и конкретный ответ найти сложно :) Поэтому попробую описать свою >проблему и надеюсь получить ответ =)

рассмотрим на пальцах
есть клиент "А", "Б", "В", есть сервер "С".

клиенты "Б", "В" стоят на месте смотрят на "А". "А" изначально стоит в точке "P0".

клиент "А" пошел, передал на "С" что пошел, потом периодически раз в квант времени отсылает "С", что уже находится на позиции "P1", потом на "P2" и двигается к "P3". "C" отвечает "А", что "да я согласен", что "А" находится в "P1", "P2" и транслирует эти данные "Б" и "В".

Предположим у "В", вдруг случился небольшой лаг, тогда механизм предугадывания у "В" будет двигать "А" вперед, ведь он не знает когда ему остановиться. Но вот лаг прекратился, "В" перезапросил последние корректные данные у "С" и произвел интерполяцию(экстраполяцию) истинного положения "А".

Между тем, клиенты "Б" и "В" используя механизмы интерполяции(экстраполяции) визуализируют у себя перемещение "А" между точками "P0", "P1", "P2".
Но вдруг клиент "Б" решил занять место "P3" и "C" решил, что это случилось фактически раньше клиента "А". "С" посылает всем, что "Б" находит в "P3", а "А" находится в рассчитанной "С" новой точке "P2-1". Так как клиент "А" предугадывал, что он займет P3, то у него  происходит коррекция истинного положения - интерполяция(экстраполяция) с установкой его позиции равной "P2-1".

#14
2:54, 4 июня 2010

Sh.Tac. Можно подробней как отключить этого Нейгла?)))

Страницы: 1 2 Следующая »
ПрограммированиеФорумСеть

Тема в архиве.