Как авторы Watch Dogs 2 боролись с задержкой в сетевой игре

Траектории движения автомобилей и контроль над столкновениями.

«Охота за головами» — многопользовательский режим в Watch Dogs, в котором три игрока помогают полиции нейтрализовать четвёртого. Это порождает высокоскоростные погони с участием NPC. В Ubisoft считают этот режим невероятно весёлым, однако его реализация была сопряжена с рядом проблем.

Ведущий программист Watch Dogs 2 Мэтт Дельбоск на GDC рассказал о том, как разработчики боролись с задержкой и пытались сделать так, чтобы у всех игроков в мультиплеере было одинаковое состояние мира. Мы выбрали из доклада главное.

Как авторы Watch Dogs 2 боролись с задержкой в сетевой игре

Своё выступление Дельбоск начинает с объяснения того, как функционирует сетевой компонент Watch Dogs 2. Мультиплеер работает по принципу пиринговый сети — то есть не существует единого сервера, а игроки подключаются друг к другу. В связи с этим системе приходится реплицировать множество объектов, чтобы у всех игроков они отображались одинаково: это касается и пешеходов, и уличного траффика.

Создавать реплики автомобилей особенно тяжело по нескольким причинам. Первая заключается в том, что они двигаются намного быстрее пешеходов. Например, при задержке в 100 миллисекунд разница в положении автомобилей у игроков может составлять 2-3 метра. Помимо этого, важно корректно передавать информацию о столкновениях не только игроков, но и NPC. Кроме того, человеческий глаз очень чувствителен к изменению скорости объекта — если что-то движется с непостоянной скоростью, то люди это замечают.

При счислении координат в первую очередь стоит заняться дебагом траекторий движения. На скриншоте ниже можно увидеть составляющие элементы этого процесса. Красные точки — это снапшоты, которые игроки получают от «мастера». Синяя линия — экстраполяция от этих точек, своего рода «предсказание» системы того, как будет двигаться пользователь. Зелёная линия, в свою очередь, это тот путь, который автомобиль проехал на самом деле. Таким образом, перед разработчиками стояла задача сделать так, чтобы синяя линия была максимально близка к зелёной.

Как авторы Watch Dogs 2 боролись с задержкой в сетевой игре

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

Чтобы исправить это, разработчики решили использовать для экстраполяции не прямое движение автомобиля, а «представлять», будто машина слегка поворачивает. Однако для этого недостаточно передавать лишь угол поворота передних колёс, ведь нужно учитывать позицию транспорта, скорость и угловую скорость. В попытках сделать «предсказания» точнее разработчики решили передавать также и компонент рыскания угловой скорости, чтобы угадывать направление поворота.

Это хорошо работает в тех случаях, когда машина двигается по кругу. Однако если автомобиль дрифтует, то «предсказание» окажется ошибочным. К счастью, транспорт в Watch Dogs 2 не приспособлен для этого, поэтому в Ubisoft это не сочли большой проблемой.

После внесения правок, автомобиль стал двигаться так, как показано ниже.

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

Такой подход позволяет создать весьма точную траекторию движения, однако игра вынуждена обрабатывать объекты и информацию «из прошлого». В примере, приведённом Дельбоском, разница между «мастером» и репликой составляет пять кадров. Кажется, что это не так много, однако порой могло случиться так, что один игрок врезался в другого, но у «жертвы» на экране, при этом, ничего не происходило.

Как авторы Watch Dogs 2 боролись с задержкой в сетевой игре

В Ubisoft решили эту проблему с помощью «временного смещения». Система начинает экстраполяцию через несколько кадров после получения одного снапшота, а затем подстраивает движение реплики под второй снапшот. Таким образом, реплика отстаёт от мастера всего на три кадра. Это не идеальное решение, но оно даёт лучшие результаты.

Как авторы Watch Dogs 2 боролись с задержкой в сетевой игре

Позднее тестеры стали рассказывать, что со столкновениями в мультиплеере не всё гладко — они работают не совсем так, как в одиночном режиме. Обычно, если одна машина врезается в другую, то обе останавливаются. Однако в мультиплеере автомобили отлетали друг от друга. Тогда разработчики решили кадр за кадром изучить, что же произошло.

Выяснилось, что экстраполяция «говорила» автомобилю продолжать движение после столкновения, потому что следующий снапшот с данными об аварии ещё не был получен мастером. Предсказание оказалось ошибочным. Когда же снапшот всё-таки приходил, система отбрасывала автомобиль назад, туда, где он должен был находится в момент столкновения. Всё это время автомобили накапливали импульс, поэтому в итоге и отлетали с большой скоростью.

Как авторы Watch Dogs 2 боролись с задержкой в сетевой игре

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

Однако столкновения непредсказуемы, поэтому положение автомобилей после аварии у игроков может отличаться. Разработчики попытались решить эту проблему с помощью предсказания столкновения. Такой алгоритм уже был в системе и использовался ИИ, поэтому в Ubisoft просто применили его на игроков.

Проблемы также были связаны со статичным объектами, которые не сдвинутся, если игрок врежется в них. Особенно трудно разработчикам пришлось с деревьями — они узкие, поэтому могло получится так, что игрок объезжал их не с той стороны, с которой «предсказывала» игра. В теории это приводило к подобному результату.

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

Ещё одна трудность возникла с «временным смещением». Траектория движения пешеходов создаётся с помощью интерполяции, потому что люди двигаются медленнее автомобилей. Когда игрок взаимодействует с NPC или другими пользователями вне машин, всё хорошо, потому что «временное смещение» для всех одинаковое. То же самое касается и автомобилей. Однако проблемы появляются тогда, когда игрок в автомобиле взаимодействует с другим игроком, находящимся вне транспорта — тогда столкновение может обрабатываться некорректно. Для таких случаев в Ubisoft решили симулировать физику так же, как это сделано для автомобильных аварий.

Даже после всего этого разработчики сталкивались с проблемами «зловещей долины». Например, реплики не могут крутиться вокруг своих центров массы. Кроме того, небольшие изменения в скорости объектов всё ещё были заметны. Чтобы как-то сгладить эти шероховатости, разработчики использовали постобработку — система сглаживает углы движения и перепады скорости.

4949
23 комментария

Короче, котыль на костыле едет и костылём погоняет :)

14
Ответить

Работает зато!

9
Ответить

Комментарий недоступен

1
Ответить

Всмысле костыли? По - другому и не сделаешь.

1
Ответить

Великолепное Юбисофтовское peer-to-peer, похоронившее "For Honor" и давшее солидного леща "R6".

8
Ответить

For Honor-у гг вп уже?

1
Ответить

А вообще есть удачные с точки зрения игрового процесса peer-to-peer проекты, в которых полечили бы рассинхрон, реконнекты и читы?

1
Ответить