Comments 75
В мультиплеере со столкновениями вообще никто не играл никогда.
И, наконец, разделение [синхронизации] координат и скоростей, реально рабочее решение.Принцип Гейзенберга в действии.
Работал он довольно просто: клиенты отправляли свои координаты, сервер их отправлял остальным, те на своей стороне присваивали их к машинам.
Надеюсь на лучшее, но все же спрошу: это так и оставили, или все-таки переписали? И планируете ли переписывать, если вдруг?
Хотелось бы услышать хотябы в общих чертах как сделан так сервер что он тянет так мало клиентов?
Доты или НФС: МВ?
Если я не ошибаюсь, то в 2005-м дота была как карта ВК3 и там, по сути, все работало ровно так же как обычный стратежный мультиплеер, потому что аддон только использовал встроенные возможности для модификации (которые, конечно, для того времени были просто шикарными). Само собой, как и оригинальный Варик, в качестве сервера использовалась одна из клиентских машин. К счастью, стратегии не так чувствительны к пингу и, впринципе, обновление раз в 100 мс для них не так заметно в силу особенностей (анимации имеют существенную задержку, игрок может отдать приказ, а юниты сами знают куда бежать, алгоритмы же более-менее детерминированные).
Сложнее с шутерами — там используется еще больше трюков и из-за этого в Контре можно увидеть такой баг: я выбегаю, бросаю гранату, она летит к противнику и меня убивают. Включаю наблюдение и вижу, что граната не вылетала и меня убили до того, как я ее кинул. Ну или ты забежал за укрытие и тебя внезапно убили. Бесит, конечно, но жить можно.
Хуже всего — мультиплеер для гонок, где 100 км/час — это 28 метров в секунду. То есть за 100 мс (вполне неплохой пинг для непрофессиональной игры) машина проезжает 2.8 метра. Если грубо, то для игрока А игрок Б едет сзади, а игроку Б кажется, что они с игроком А на одном уровне. И для игрока А считается допустимым повернуть повернуть направо (там ведь нету машины соперника), а клиент игрока Б понятия не имеет как обработать эту ситуацию. Авторам статьи уважение и почет, что они взялись за такую стремную задачу.
Как вам выше ответили игра скорее всего тормозила не из-за пинга, а из-за анимаций множества действий. То же можно было наблюдать и в обычной синглплеерной игре против многих компьютеров — когда шёл жесткий замес со множество юзеров — игра начинала подтормаживать, а то, что у вас было всего 40 фпс указывает, что даже в спокойной обстановке компьютер работал почти на пределе.
Если бы были проблемы с каналом, то это проявлялось бы иначе — противники бы «телепортировались» в неожиданные места, обновлялись бы дерганно — пробежал, остановился, пробежал быстрее, внезапно скастовав сразу три заклинания и т.п.
А если бы у вас не хватало ширины канала, (скажем, игра расчитана на минимум 128 кбит/с, а у вас всего 64 кбит/с), то вы бы просто не смогли играть со временем (с увеличением количества юнитов — увеличивается и нагрузка на канал). Хотя, если я не ошибаюсь, в доте всегда приблизительно одинаковое количество юнитов, а следовательно и стабильная нагрузка на канал в силу гейм-дизайна.
Если грубо, то для игрока А игрок Б едет сзади, а игроку Б кажется, что они с игроком А на одном уровне. И для игрока А считается допустимым повернуть повернуть направо (там ведь нету машины соперника), а клиент игрока Б понятия не имеет как обработать эту ситуацию.
Теория относительности как она есть.
… Сложнее с шутерами — там используется еще больше трюков и из-за этого в Контре можно увидеть такой баг...
В дотке, которая была картой WC3, были другие грустные ситуации — юзаешь скилл или расходник, а он не юзается из-за того, что потерялся пакет или пинг высокий. То же самое с добиванием крипов: тыцнул "атака" вовремя, лаг/задержка — крипа убил не ты.
Всё же, это не классическая стратегия, где ± 100 мс на обработку "начни апгрейд здания", по большому счёту, ничего не решают. Это скорее экшн от третьего лица, чем стратегия.
Во время гонки противник не пролетает мимо на скорости 100 м/с.
Ситуация как раз сложней в шутерах, где нет инерционности той же машины.
На 100 м/с вперед вполне себе можно делать предсказание и корректировать по приходу реальных пакетов. И это будет работать на гоночных скоростях.
1. У игрока А пинг 1 мс, у игрока Б пинг 200 мс. Начинается игра, оба посылают на сервер «еду вперед». Через 100 мс (200 / 2) на сервере и игрока будут значения: игрок А начал ехать в момент 1мс и проехал 1 метр, игрок Б только начал ехать. Для игрока Б значение будет следующее: игрок А начал ехать, игрок Б начал ехать 100 мс.
2. Больше доверия клиенту, не только команду, но и время от начала гонки, когда игрок стартовал. Начинается игра. Игрок Б и игрок А стартует, но видят старт другого игрока только через 100 мс.
Теперь представляем другое. Игрок А и Б едут по соседним полосам на большой скорости. Навстречу игроку Б летит грузовик. В последний момент игрок Б нажимает кнопку вправо и обходит грузовик, но на сервер и к игроку А эта информация приходит слишком поздно, по их экстраполяции столкновение с грузовиком уже произошло, запущена анимация взрыва и отняты последние хит поинты у машины. Теперь мы или пост-фактум сообщаем игроку Б: «извини, парень, мы передумали, ты не успел». Или на сервере и у игрока А говорим: «не, стоп, столкновения не было, игрок Б таки не взорвался, грузовик верни на место, анимацию взрыва останови, игрок Б на самом деле объехал грузовик справа».
Дальше, два игрока едут рядом. Игрок Б видит грузовик на крайней левой полосе и в последний момент нажимает кнопку «влево», толкая игрока А прям в грузовик. Для игрока Б все произошло как раз вовремя, запускается анимация тарана игрока А. Пока игроку А дошла информация о маневре игрока Б он уже проехал грузовик и может ударится только ему вбок. Нам необходимо инвалидировать или информацию игрока А или информацию игрока Б, а инвалидация — это не просто изменить координаты, а сложные изменения логики в физике
Конечно, команды с привязкой ко времени хотя и дают больше возможности читерам и усложняют написание сервер — для игры значительно лучше, но тоже имеют множество проблем и как раз за счет скоростей и возможностей резкой смены скорости (хорошие тормоза, контролированный или неконтролированный удар)
В шутерах, конечно, нету инерционности, но зато там значительно меньшие скорости и, обычно, значительно меньше важность у физики.
Со стратегиями — да. Более менее норм.
В шутерах и прочих Экшн играх используется интерполяция — сервер говорит, то что было n-миллисекунд назад, хотя слушает в реалтайме. Это сделано для того, чтобы он знал все действия на шаг вперед и клиенты могли "сгладить" движения.
В итоге в Counter-Strike 1.6 был даже фича баг, из-за которой игроки, которые выстрелили в промежуток меньший чем те же n-миллисекунд, убивали друг друга и раунд заканчивался ничьёй.
В CS:GO — это пофиксили, поэтому порой случается так, что ты слышишь выстрел, уже радуешься победе, а игра показывает что ты умер, а противник жив.
С гонками и симуляторами космических кораблей поступают совсем иначе — используют обратный метод к интерполяции — экстраполяцию: ты говоришь что другая машина находится в координатах xyz и движется со скоростью uV (u — вектор направления движения, V — скорость). Отсылая эти данные на клиент мы можем на стороне клиента смоделировать плавное движение других машин.
Из-за этого в таких гонках можно увидеть как машина противника уезжает в стену, ты ликуешь, а потом оказывается что был рассинхрон и он на самом деле всё ещё впереди тебя. Второй случай — когда они врезаются в объекты и, сначала кажется будто они прошли через них или объехали, а потом "возвращаются" на место столкновения.
З.ы. мне кажется что нечто подобное с экстраполяцией использовали и в WoW — когда происходит рассинхрон — если герой на момент рассинхрона шёл вперед, то он продолжает идти вперед.
100 мс может быть между континетами, обычно он до 50 мс.
между континентами он больше. Переехал из одного города в другой. Расстояние 350км. В первом пинг был в районе 35мс, в текущем 15мс.
Это конечно увеличит отклит на управление, но все остальные проблемы должны решиться.
Видео геймплея: https://youtu.be/LMGLWHeLuJo.
Скриншоты есть в статье, если хотите поиграть, то есть Discord-сервер: https://discord.gg/383Q6q5. Общение в основном на английском, но есть русский канал.
Был бы очень рад тоже получить приглашение!
А не пробовали трюк из третьей Quake с передачей только изменившихся состояний?
P.S. Osdever меня заминусует однозначно)
Коммент одобрил. Ворлд же уже, вроде бы, вполне рабочий, не?
По поводу МВ-Онлайн, вам бы как-то найти параметры ботов, отвечающие за машину и её тюнинг, после брать эти же параметры с машины игрока и посредством передачи сервера присваивать их ботам (возможно чушь несу). Уже будет достойная основа :)
Как мы мультиплеер для NFS MW писали