Тема: Black Bird
Показать сообщение отдельно
Старый 29.06.2012, 03:38   #53
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Black Bird

Суть "справедливых" решений заключается в том кто решает что игрок попал, а кто нет, и на основании каких данных.
Т.к. избежать задержки невозможно, и данные с одного клиента будут идти до другого за промежуток времени задержки одного клиента плюс задержки другого, то тут нужно думать о симуляции "будущих" данных на клиентах.
Суть проста: Authoritative Server <> Client модель самая стойкая и популярная на данный момент.
Сервер всегда прав и просчитывает всё сам.
Клиент лишь "просит" у сервера всё, и отдаёт ему собственный ввод.

Сервер получает ввод и симулирует поведение сетевых объектов.
Затем с определённой частотой раздаёт клиентам пакеты состояний. Частота раздач намного меньше чем частота симуляции. Например симуляция может быть 30 тактов в секунду, а раздач 10 в секунду.
Следственно клиент должен сглаживать данные. Но т.к. мы уже говорили о том что клиент должен предсказывать, следственно получая данные от сервера, клиент должен вычислять предполагаемые будущие данные, и затем симулировать поведение уже с расчётом на предполагаемые данные. Это называется экстраполяция.
Долгота предположений должна зависеть от промежутка времени между пакетами состояния мира (в данном случае 100 мс), плюс собственный пинг (сглаженный по времени), таким образом клиент будет пытаться предположить весьма далеко состояние которое на самом деле сейчас происходит на сервере.

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

Далее самое сложное, это серверная часть. Т.к. симулируем всё на клиентах приближенно к серверным в реальном времени данным, ошибка будет, но мы её не учитываем. Задача тут, является вычисления в прошлом.
Например клиента А с задержкой 80мс, в момент 100мс, стреляет. Пакет приходит на сервер уже в момент 180мс, но данные основывались на 80мс времени ранее. Для справедливости, сервер должен посмотреть на критичные данные для справедливых вычислений (позиции самолётов), на 80мс назад по времени с момента получения пакета (180мс), сделать вычисления, и послать клиенту ответ. Клиент же уже всё симулировал (выстрел), но реально попал или нет, узнал только от сервера на 300мс. Почему не 260? Потому что сервер посылает пакеты обновлений каждые 100мс. И лишь потом мы можем увидеть изменения в ХП у противника, и возможно эффекты взрывов (если уже не симулировал).
Отклик будет 200мс хоть и задержка у клиента 80мс.
Хитрости которые можно тут применить, это полёт пули на клиенте, как раз не мгновенный, когда сервер же вычисляет всё сразу (лучи), тем самым можно клиенту дать инфу о поподаниях, даже до того как у клиента пуля долетит до противника. Следственно с такой хитростью, упрощается логика на сервере, и не чувствуется лага.
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
4yBa4Ok (30.06.2012), EvilChaotic (30.06.2012), LLI.T.A.L.K.E.R. (29.06.2012), St_AnGer (30.06.2012)