Halo Networking: интервью с Крисом Батчером

Dec 14 2004
Подготовить Halo 2 к игре на X-Box Live было непростой задачей. Узнайте, что нужно для того, чтобы все эти X-box хорошо работали вместе, в интервью с Крисом Батчером из Bungie.

Крис Батчер — один из четырех ведущих инженеров Bungie Studios , которые отвечали за создание хита « Halo 2 ». Если вы читали нашу статью об искусственном интеллекте Halo 2 , то вы уже знаете, что Крис действительно умный чувак. Когда я посетил Bungie 3 ноября, у меня была возможность дважды посидеть с Крисом.

Одно из самых больших различий между «Halo 2» и оригинальной «Halo» заключается в том, что в «Halo 2» можно играть через Xbox Live. Чтобы осуществить это, Bungie пришлось создать новый способ сетевых многопользовательских матчей Halo через Интернет. Эта ответственность легла в основном на плечи Криса. В моем втором интервью мы обсуждали нетворкинг «Halo 2».

 

Bungie представляет миру мультиплеер Halo 2.

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

«Итак, что нужно было сделать, чтобы выпустить «Halo 2» в прямом эфире?»

Продолжайте читать его ответ.

Хотите больше гало?

У нас есть: внутренняя информация о создании сюжета и звука, экскурсия по студиям Bungie, введение в историю Halo и многое другое.

Нажмите здесь, чтобы проверить все это.

Содержание
  1. Оставайтесь вместе сейчас
  2. Кто здесь главный?
  3. Новая сеть для Halo 2
  4. Например
  5. Все на своих местах
  6. Четко расставляйте приоритеты

Оставайтесь вместе сейчас

«Halo 1 — это то, что называется синхронной сетью».

Крис Батчер :

«Halo 1 была сетевой игрой, потому что вы могли играть в нее через локальную сеть (LAN) с помощью System Link. Это было очень успешной частью игры. и распространите сетевую модель на Интернет, чтобы вы могли играть через Xbox Live.

Сеть Halo 1 называется синхронной сетью . Это означает, что если у вас есть некоторое количество приложений и разных экземпляров программного обеспечения, работающих на разных машинах. При этом игра идет на четырех Xbox. На всех этих машинах запущена одна и та же игровая симуляция, и эта игровая симуляция является детерминированной. Это означает, что если вы предоставите симуляции одни и те же входные данные, она будет давать те же выходные данные, когда вы запускаете весь этот код. Мы используем этот факт, чтобы усилить многопользовательскую игру. Вместо того, чтобы отправлять [информацию] каждой машине — каждую часть информации о том, что происходит во всем игровом мире — вместо этого мы отправляем: «Вот входные данные, которые мы предоставляем для симуляции игры в данный момент времени. "

Теперь наша игра работает с частотой 30 тиков в секунду, потому что NTSC — это 60 герц. Итак, мы запускаем один игровой тик для каждых двух отрисовок экрана.... и рендерим по одному кадру за раз, так что наша частота кадров составляет 30 кадров в секунду. Каждый раз, когда мы запускаем игру, машина пробует то, что игроки делают в игре в данный момент. Например, что они делают на своих контроллерах, прыгают ли они или получают машины, поворачивают на три градуса влево, нажимают кнопку огня... или что-то в этом роде.

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

Кто здесь главный?

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

Крис Батчер продолжает :

«Halo также представляет собой сетевую модель, основанную на клиент-сервере, что означает, что одна машина в игре является сервером игры, а затем все присоединяются к ней, делая эту машину главной. Если вы являетесь клиентом, вы отправляете свои действия на сервер. а затем, когда сервер получает действия от всех, он отправляет все коллективные действия всем клиентам И таким образом мы удостоверяемся, что все вместе находятся в одной игре.

На самом деле это та же сетевая модель, которую мы использовали в Marathon в свое время, хотя в Marathon были некоторые ошибки. Проблема с этой сетевой моделью в том, что если в компьютерном коде есть ошибка, из-за которой две машины могут предоставлять одни и те же входные данные, но получать разные выходные данные, могут возникнуть проблемы. Есть много разных способов, которые могут произойти. Это может быть ошибка, когда вы используете только некоторую случайную память мусора в компьютере, и это будет случайным от машины к машине. Это было бы плохо.

Другое дело, что мы не запускаем одну и ту же симуляцию на всех машинах. Когда [сервер] отправляет информацию о том, какие действия происходят на всех машинах, [он] не отправляет их всем. Это была бы чистая одноранговая модель , если бы мы рассылали ее всем.

Дело в том, что мы запускаем симуляцию и управляем миром, это часть того, что мы делаем, но затем в каждом кадре мы также должны делать что-то только для локального игрока, например, вы должны выяснить, какое у него оружие от первого лица. делают, перезаряжают ли они или бросают гранату. На самом деле мы также передаем их взгляд на мир.

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

Если мы будем держать их разделенными, то игра останется синхронизированной между другими машинами. Но если они не разделены правильно — если между ними есть информация, — тогда машины будут расходиться в симуляции, и вы можете не заметить этого, потому что одна машина может быть такой, как если бы игрок был здесь, а тот же самый игрок был бы здесь. [немного в другом месте] на чужой машине, так что вы можете не заметить этого, если только вы не попытаетесь выстрелить в них и пуля не попала в них таким образом, что попала в них на одной машине и не попала в них на другой машине. Затем расхождение в основном распространяется таким образом, пока в конечном итоге игра не станет совершенно другой на разных машинах, и тогда это, конечно, бессмысленно».

Новая сеть для Halo 2

Крис Батчер продолжает :

«Итак, дело в том, что, поскольку клиент отправляет серверу свои действия, а сервер отправляет их обратно клиенту, у вас должен быть круговой маршрут между клиентом и сервером. Это отлично работает в локальных сетях. Задержка между ящиками, вероятно, две или три миллисекунды. Вы знаете, если вы используете программное обеспечение XB Connect , где у вас может быть ПК, который туннелирует трафик от вашего Xbox через Интернет, вы действительно можете заставить его работать между людьми через Интернет. Но наш опыт заключается в том, что, поскольку вы являетесь клиентом, вам нужно ждать, пока ваш сервер отправится туда и обратно, чтобы ваше действие что-либо сделало. Все ваши движения или стрельба отстают на некоторое количество. Чего мы хотим избежать с «Halo 2», так это разработка сетевой модели, которая действительно восприимчива к этому.

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

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

Так что это своего рода артефакты сетевой модели. Дело в том, что когда вы взаимодействуете с коллективным источником ввода с какой-то другой машины, вы видите странность, которая не соответствует тому, каким был ваш предсказанный мир на вашей машине. Таким образом, мы поступаем следующим образом: нам по-прежнему нужен клиент-сервер/модель, но клиент отправляет серверу не только информацию об этих нажатиях кнопок, которые я делаю, но и на более высоком уровне, это информация о том, где я я в мире и что я делаю в этот момент. Таким образом, вместо того, чтобы говорить, что я регулирую усилие джойстика на 23 градуса, он просто сказал бы, что я в Бородавочнике, я здесь и еду в этом направлении.

Вы также отправляете поток событий на сервер, говоря, что это то, что, по моему мнению, происходит в моем мире. Как будто я бросаю гранату, я думаю, что выстрелил в того парня, я думаю, что попал ему в голову. Затем сервер обрабатывает эти потоки с каждой машины — это все их версии событий. И что происходит, так это то, что сервер также запускает свою симуляцию. Разница в том, что это не предсказано; это власть. Он отвечает за все, что происходит в игре».

Например

«Сервер — единственная машина, которая может создавать разрушающие объекты и делать другие вещи, например, наносить урон людям, награждать за убийства и тому подобное».

Крис Батчер продолжает :

«Итак, если я клиент и нажимаю на курок, чтобы бросить гранату, я фактически создаю гранату в мире. Я воспроизведу анимацию, я воспроизведу звук. влияет на мир] -- мне не разрешено создавать это, потому что это действие требует полномочий для этого.Сервер - единственная машина, которая может создавать разрушающий объект и делать другие вещи, например наносить урон людям или награждать за убийства и т.д. Итак, что происходит, так это то, что клиенты отправляют запросы на сервер, такие как «Я прошу бросить сюда гранату». Сервер скажет: «Хорошо, я верю вам, потому что мои знания говорят о том, что вы находитесь здесь, в этом месте, и это согласуется с моей версией событий». Так что, по сути, есть' взаимодействие между клиентом, отправляющим свою версию событий на сервер, и сервером, пытающимся согласовать их и создать достоверную версию мира. Затем он рассылает официальную версию всем в мире.

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

Все на своих местах

«Затем клиент может использовать эту информацию, чтобы предсказать, возможно, на следующие 300 миллисекунд, как это будет выглядеть, прежде чем парень действительно доберется туда».

Крис Батчер продолжает :

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

Итак, у нас есть код, управляющий объектами в предсказанном клиентском мире. В основном он пытается сгладить внешний вид того, что происходит с игроками в мире. Например, вместо того, чтобы просто отправить игроку «Он здесь, он здесь, он здесь». сервер отправляет: «Он здесь, и вот что он делает, и это то направление, в котором он движется». Затем клиент может использовать эту информацию, чтобы предсказать, возможно, на следующие 300 миллисекунд, как это будет выглядеть, прежде чем парень действительно доберется туда. Поэтому вместо того, чтобы видеть, как парень дергается, дергается, дергается, дергается, я вижу его здесь, и он бежит сюда, и он бежит сюда.

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

Итак, проблема в основном... в том, что серверы должны генерировать этот поток информации от клиентов. И как они это делают? Что ж, мы делаем это так, что есть два разных типа вещей, которые сервер может отправлять: состояние постоянства объектов и происходящие события.

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

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

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

Четко расставляйте приоритеты

Крис Батчер продолжает :

«По сути, система запоминает то, что она отправляет людям. Она знает, что у меня есть 5000 единиц информации, которые я хотел бы, чтобы вы имели, но я могу отправить вам, может быть, 50 в этом пакете, потому что сеть позволяет только пакеты определенного размера, передается с определенной скоростью, чтобы не перегружать сеть.

Таким образом, выясняется, что самые важные вещи зависят от того, где вы находитесь, что вы делаете, живы вы или мертвы, стреляете ли вы в кого-то. Вы знаете, если я стреляю в кого-то, и они передо мной, мне нужно знать о них с очень высоким приоритетом. Но если позади меня есть кто-то, кого я не вижу, мне не нужно знать о них. Сервер определяет приоритет объектов. Есть много правил для вещей. Гранаты имеют приоритет от 50 до 70, но просто небольшой объект, лежащий на земле, может быть, не является приоритетом — между 10 и 20, вы знаете, или что-то в этом роде. На самом деле бывают случаи, когда объект с низким приоритетом вообще не будет отображаться на стороне клиента.

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

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

Такое разделение данных означает, что мы можем поддерживать самые разные интересные вещи. Например, поскольку каждому клиенту отправляется постоянное состояние сущностей в мире (сущности — это то, что мы называем постоянными объектами в мире), это означает, что любой клиент имеет всю информацию о мире. Поскольку клиент знает все об этом мире, мы можем поддержать создание нового сервера, если серверная машина отключится, отключится от Xbox Live или игрок просто захочет выйти из игры. Происходит то, что игра ставится на паузу, определяется новый сервер, смещается управление и игра продолжается. Это работает и в игре по локальной сети. Таким образом, вы можете закончить игру с совершенно другим набором игроков, чем в начале, потому что у нас есть технология для воспроизведения этой информации и переназначения нового сервера.

Потенциал Xbox live может быть действительно захватывающим. Есть множество интересных социальных последствий для этой онлайн-игры. Это гораздо больше, чем даже то, о чем мы говорили. Я не лучший человек, с которым можно говорить обо всех социальных аспектах разработки пользовательского интерфейса или направления игроков в игры, но я определенно могу говорить о сетевой стороне вещей».

Ты, конечно, можешь, Крис, ты, конечно, можешь.