Как авторы Watch Dogs 2 боролись с задержкой в сетевой игре
Траектории движения автомобилей и контроль над столкновениями.
«Охота за головами» — многопользовательский режим в Watch Dogs, в котором три игрока помогают полиции нейтрализовать четвёртого. Это порождает высокоскоростные погони с участием NPC. В Ubisoft считают этот режим невероятно весёлым, однако его реализация была сопряжена с рядом проблем.
Ведущий программист Watch Dogs 2 Мэтт Дельбоск на GDC рассказал о том, как разработчики боролись с задержкой и пытались сделать так, чтобы у всех игроков в мультиплеере было одинаковое состояние мира. Мы выбрали из доклада главное.
Своё выступление Дельбоск начинает с объяснения того, как функционирует сетевой компонент Watch Dogs 2. Мультиплеер работает по принципу пиринговый сети — то есть не существует единого сервера, а игроки подключаются друг к другу. В связи с этим системе приходится реплицировать множество объектов, чтобы у всех игроков они отображались одинаково: это касается и пешеходов, и уличного траффика.
Создавать реплики автомобилей особенно тяжело по нескольким причинам. Первая заключается в том, что они двигаются намного быстрее пешеходов. Например, при задержке в 100 миллисекунд разница в положении автомобилей у игроков может составлять 2-3 метра. Помимо этого, важно корректно передавать информацию о столкновениях не только игроков, но и NPC. Кроме того, человеческий глаз очень чувствителен к изменению скорости объекта — если что-то движется с непостоянной скоростью, то люди это замечают.
При счислении координат в первую очередь стоит заняться дебагом траекторий движения. На скриншоте ниже можно увидеть составляющие элементы этого процесса. Красные точки — это снапшоты, которые игроки получают от «мастера». Синяя линия — экстраполяция от этих точек, своего рода «предсказание» системы того, как будет двигаться пользователь. Зелёная линия, в свою очередь, это тот путь, который автомобиль проехал на самом деле. Таким образом, перед разработчиками стояла задача сделать так, чтобы синяя линия была максимально близка к зелёной.
Для счисления координат в Ubisoft отталкивались от алгоритма проективного смешивания скорости, предполагающего смешивание двух проекций — последней известной и текущей. Само по себе это работает не слишком хорошо, что можно увидеть ниже.
Чтобы исправить это, разработчики решили использовать для экстраполяции не прямое движение автомобиля, а «представлять», будто машина слегка поворачивает. Однако для этого недостаточно передавать лишь угол поворота передних колёс, ведь нужно учитывать позицию транспорта, скорость и угловую скорость. В попытках сделать «предсказания» точнее разработчики решили передавать также и компонент рыскания угловой скорости, чтобы угадывать направление поворота.
Это хорошо работает в тех случаях, когда машина двигается по кругу. Однако если автомобиль дрифтует, то «предсказание» окажется ошибочным. К счастью, транспорт в Watch Dogs 2 не приспособлен для этого, поэтому в Ubisoft это не сочли большой проблемой.
После внесения правок, автомобиль стал двигаться так, как показано ниже.
Следующая техника, которую использовали в Ubisoft, называется буферизация снапшотов. Вместо того, чтобы экстраполировать по полученным снапшотам, система буфферизировала их, а затем дожидалась следующих, после чего строила маршрут на основе двух точек.
Такой подход позволяет создать весьма точную траекторию движения, однако игра вынуждена обрабатывать объекты и информацию «из прошлого». В примере, приведённом Дельбоском, разница между «мастером» и репликой составляет пять кадров. Кажется, что это не так много, однако порой могло случиться так, что один игрок врезался в другого, но у «жертвы» на экране, при этом, ничего не происходило.
В Ubisoft решили эту проблему с помощью «временного смещения». Система начинает экстраполяцию через несколько кадров после получения одного снапшота, а затем подстраивает движение реплики под второй снапшот. Таким образом, реплика отстаёт от мастера всего на три кадра. Это не идеальное решение, но оно даёт лучшие результаты.
Позднее тестеры стали рассказывать, что со столкновениями в мультиплеере не всё гладко — они работают не совсем так, как в одиночном режиме. Обычно, если одна машина врезается в другую, то обе останавливаются. Однако в мультиплеере автомобили отлетали друг от друга. Тогда разработчики решили кадр за кадром изучить, что же произошло.
Выяснилось, что экстраполяция «говорила» автомобилю продолжать движение после столкновения, потому что следующий снапшот с данными об аварии ещё не был получен мастером. Предсказание оказалось ошибочным. Когда же снапшот всё-таки приходил, система отбрасывала автомобиль назад, туда, где он должен был находится в момент столкновения. Всё это время автомобили накапливали импульс, поэтому в итоге и отлетали с большой скоростью.
Решить эту проблему в мультиплеере, который работает по принципу пиринговый сети, невозможно, поэтому разработчикам пришлось прибегнуть к симуляции физики. То есть игра симулирует столкновение локально, а после получения снапшота результат подстраивается под актуальные данные о состоянии игрового мира. Интересно, что переход от локальной симуляции к счислению координат для мотоциклов происходит быстрее, чем для автомобилей.
Однако столкновения непредсказуемы, поэтому положение автомобилей после аварии у игроков может отличаться. Разработчики попытались решить эту проблему с помощью предсказания столкновения. Такой алгоритм уже был в системе и использовался ИИ, поэтому в Ubisoft просто применили его на игроков.
Проблемы также были связаны со статичным объектами, которые не сдвинутся, если игрок врежется в них. Особенно трудно разработчикам пришлось с деревьями — они узкие, поэтому могло получится так, что игрок объезжал их не с той стороны, с которой «предсказывала» игра. В теории это приводило к подобному результату.
В Ubisoft решили, что лучшим выходом будет слегка сдвигать автомобили с их позиции, когда фиксируется большое количество столкновений.
Ещё одна трудность возникла с «временным смещением». Траектория движения пешеходов создаётся с помощью интерполяции, потому что люди двигаются медленнее автомобилей. Когда игрок взаимодействует с NPC или другими пользователями вне машин, всё хорошо, потому что «временное смещение» для всех одинаковое. То же самое касается и автомобилей. Однако проблемы появляются тогда, когда игрок в автомобиле взаимодействует с другим игроком, находящимся вне транспорта — тогда столкновение может обрабатываться некорректно. Для таких случаев в Ubisoft решили симулировать физику так же, как это сделано для автомобильных аварий.
Даже после всего этого разработчики сталкивались с проблемами «зловещей долины». Например, реплики не могут крутиться вокруг своих центров массы. Кроме того, небольшие изменения в скорости объектов всё ещё были заметны. Чтобы как-то сгладить эти шероховатости, разработчики использовали постобработку — система сглаживает углы движения и перепады скорости.