Показать сообщение отдельно
Старый 27.03.2009, 09:05   #9
jimon
 
Сообщений: n/a
Ответ: Онлайн (Клиент <-> Сервер)

MoKa
дык, не всё же так просто - имеем игрок_1, игрок_2, сервер
между игрок_1 и сервером пинг A, между игрок_2 и сервером пинг B,сервер может отправлять пакеты с задержкой C (время между приемом и отправкой - тоесть обработка)

игрок_1 посылает данные в на сервер при этом клиент игрока_1 тут же после отсылки начинает анимацию движения (хотя задержка должна быть равна A+C), сервер получает данные и отправляет назад коректировочные параметры (античитерство)
тоже самое с игроком_2, там время разницы между игрой и сервером B+C
из-за того что двум игрокам надо знать друг получаем что игрок_1 получит данные от игрок_2 при времени A/2+B/2+2*C (половинный пинг, две обработки сервера - игроки же не одновременно отправляют данные)
но всё это идеализированая ситуация системы, крайне жестого завязаной на пингах, представим что у кого-то пинг очень резко подскачет до 500 мс (винда заглючила, игра ресурсы подгружает и тд)
в идеале коректировка должна правильно отобрасить всё движение игрока, но зачастую рывков не избежать, но что делать серверу ? он же получает почти что нажатия на клавиши (иначе как сделать античит?)
при этом сервер тупо не знает какая разница в внутри игровом времени себя и игроков, конечно оно синхронизируется, но это хорошо когда пинги не скачут, а иногда так подскочут что разница в внутриигровом времени будет больше и получится что к нам прийдут пакеты "из прошлого", по-сути в них игровое время уже меньше чем текущее

так что реальная задержка между данными может прыгать от A/2+B/2+2*C до A+B+2*C, надо еще учитывать что иногда мы теряем пакеты из-за времени (ихная актуальность теряется быстрее чем они доходят до клиента, а пока клиент запросит новый пакет тоже что-то надо отображать - процесс синхронизации еще больнее)
чтобы сделать задержку меньше моего написаного A/2+B/2+2*C всякие игры делают мега извращения - предсказания пути, то-есть по уже полученым данным о траектории пути, клиент начинает добавлять туда точки чтобы предсказать траекторию дальше, а если она не будет сходится с тем что мы получим от сервера ? ну тогда жестоко прийдется переставлять позицию или применять какую-то очень сложную коректировку которая не всегда правильно смотрится
из-за этого игровое время на сервере опережает игровое время на всех клиентах
но даже саму траекторию, полученую по-точкам от сервера, пусть даже без задержек, но надо же чем-то анимировать ? тут тоже свои причуды

исходя из этого можно сказать что проблемы следуйшие :
1) пинги не стабильны
2) разница в игровом времени на всех клиентах и сервере
3) нечеловеческие усилия алгоритмов предсказания и коректировщиков траектории
4) слишком большая разница во времени между действительно актуальными пакетами (движек q3 тупо игнорит не актуальные), а во время этой разницы надо отрисовать хотя бы 100 кадров (обычно)

так что создание хорошей сетевой части игры равноценно программированию всей игры

Последний раз редактировалось jimon, 28.03.2009 в 12:27.
 
Ответить с цитированием
Эти 10 пользователя(ей) сказали Спасибо за это полезное сообщение:
Arles (05.10.2009), DartWaider aka Yxo (28.03.2009), Egor Rezenov (21.07.2011), moka (28.03.2009), newman (30.03.2009), panmazai (19.09.2009), Phantom (27.03.2009), tormoz (28.03.2009), Yalenz (27.03.2009), ІГРОГРАЙКО (19.09.2009)