В последнее время, когда я играл в Animal Crossing, я часто сталкивался с некоторыми загадочными онлайн-проблемами. После поиска в Интернете я обнаружил, что все ответы имеют тенденцию объясняться метафизикой, поэтому мне стало интересно понять эти проблемы в принципе. игра и технические причины некоторых сетевых настроек этой игры.
Заранее заявляю, что не занимаюсь игровой индустрией и не являюсь давним игроком в консольные игры, если есть какие-то ошибки или дополнения с других точек зрения, пишите в комментариях.
Как синхронизируются игры
Давайте сначала посмотрим, как синхронизируется общая игра.
Представьте себе две отдельные комнаты с двумя игроками, А и Б, которые хотят удаленно сыграть в шахматы. Им нужно знать текущую ситуацию на шахматной доске перед каждым следующим ходом.Для этого есть два способа.
Первый называется синхронизацией шага. Принцип заключается в том, что игрок уведомляет другого игрока каждый раз, когда он выполняет шаг, и синхронизирует текущую последовательность операций друг с другом. Благодаря этим синхронизированным операциям можно рассчитать состояние текущей шахматной партии. Но он не позволяет потерять информацию о каком-либо шаге на середине, иначе будет очень большое расхождение в расчетах.
Второй называется синхронизацией состояний, как следует из названия, состояние всей шахматной доски синхронизируется каждый раз, когда игрок делает шаг. Этот метод допускает потерю некоторых состояний в середине, а конечное состояние остается прежним.
На практике пошаговая синхронизация будет больше использоваться для игр, в которых игроки работают очень часто, таких как King of Glory. Для этих карточных игр более склонны напрямую использовать синхронизацию состояний.
как игра связана
Коммуникационная архитектура
Независимо от вышеперечисленных способов синхронизации нам необходимо обмениваться данными между несколькими хостами по сети. Теперь мы переключим сцену на трех человек A, B и C, играющих в шашки вместе. Чтобы убедиться, что итоговое состояние игры, полученное тремя людьми, согласовано, нам часто требуется хост-хост в качестве полномочного хоста, а другие хосты могут обновлять свои локальные игровые данные только с помощью данных (статус/последовательность операций), выдаваемых сервером. авторитетный хозяин. .
Здесь мы предполагаем, что A является «Хостом».Каждый шаг операции B и C должен быть отправлен A для подтверждения, а затем информация о том, что операция была подтверждена, отправляется B и C. В это время, B и C могут считать операцию успешной и обновить экран до последнего состояния. Хост А в любое время имеет реальное состояние текущей игры, а другие хосты просто следуют статусу хоста А, чтобы обновить свой игровой экран.
В приведенном выше режиме, поскольку хост А используется не только в качестве игрового хоста, но и в качестве хоста синхронизации состояния, когда количество онлайн-пользователей слишком велико, хост А будет перегружен, и так называемый «взрывной происходит явление "машина/взрывающийся остров". Кроме того, этот режим требует, чтобы хост A постоянно выживал, и его можно использовать только в качестве краткосрочного серворешения. Таким образом, в некоторых играх будет представлен внешний самодельный/официальный сервер для выполнения этой функции синхронизации состояния, например, minecraft. Но принцип точно такой же.
Обход NAT
Поняв базовые знания выше, мы можем обнаружить, что без учета внешнего сервера у нас есть следующие требования к сети между игроками и хостами:
- A может отправлять данные B и C
- B и C могут отправлять данные в A
- Нет необходимости в сетевом соединении между B и C
Хотя приведенные выше требования кажутся легкими, из-за того, что сетевые операторы сейчас используют их в разной степени.NATТехнология, поэтому установить двустороннюю связь между двумя домашними хостами не очень просто.
Обычно существует четыре различных типа NAT для домашних сетей:
Full-cone NAT:
- Once an internal address (iAddr:iPort) is mapped to an external address (eAddr:ePort), any packets from iAddr:iPort are sent through eAddr:ePort.
- Any external host can send packets to iAddr:iPort by sending packets to eAddr:ePort.
(Address)-restricted-cone NAT:
- Once an internal address (iAddr:iPort) is mapped to an external address (eAddr:ePort), any packets from iAddr:iPort are sent through eAddr:ePort.
- An external host (hAddr:any) can send packets to iAddr:iPort by sending packets to eAddr:ePort only if iAddr:iPort has previously sent a packet to hAddr:any. "Any" means the port number doesn't matter.
Port-restricted-cone NAT:
- Once an internal address (iAddr:iPort) is mapped to an external address (eAddr:ePort), any packets from iAddr:iPort are sent through eAddr:ePort.
- An external host (hAddr:hPort) can send packets to iAddr:iPort by sending packets to eAddr:ePort only if iAddr:iPort has previously sent a packet to hAddr:hPort.
Symmetric NAT
- Each request from the same internal IP address and port to a specific destination IP address and port is mapped to a unique external source IP address and port; if the same internal host sends a packet even with the same source address and port but to a different destination, a different mapping is used.
- Only an external host that receives a packet from an internal host can send a packet back.
Вышеупомянутые четыре типа NAT просто резюмируются следующим образом:
- Первые три типа конусов NAT могут сопоставлять iAddr:iPort внутренней сети с фиксированным eAddr:ePort внешней сети. Только симметричные типы сопоставляются с разными eAddr:ePorts для одного и того же iAddr:iPort, но с разными IP-адресами и портами назначения.
- Разницу между первыми тремя типами конусов NAT можно увидеть непосредственно из названия, address-restricted-cone означает, что только адрес, который отправил пакеты во внешний мир, способен отправлять пакеты на него, а port-restricted-cone означает, что только он отправляет пакеты во внешний мир.Адрес: адрес порта пакета способен отправлять пакеты на него.
- Четвертый симметричный тип ограничивает источник возвращаемых извне пакетов в соответствии с port-restricted-cone.
Функция проверки сети на хосте может сообщить нам тип NAT текущей сети. Типы A, B, C и D на коммутаторе сопоставляются с четырьмя вышеуказанными типами соответственно, в то время как PS4 — это тип 1 (прямое подключение, без NAT), 2 (несимметричный NAT) и 3 (симметричный NAT). Для удобства следующего описания мы используем ABCD Switch для обозначения вышеуказанных четырех типов сетей.
Поняв соответствующие ограничения четырех типов NAT, мы можем определить путем вывода, в каких двух типах сетей NAT невозможно установить двустороннюю связь, и больше не нужно пробовать человеческую плоть. Здесь мы приводим примеры, чтобы представить различные ситуации с разными типами NAT: A — хост-хост, и у нас есть внешняя онлайн-служба, которая может получить информацию об IP-адресах A и B. Так называемая онлайн-служба является сторонним сервером, и как A, так и B могут искать информацию об IP-адресе внешней сети и номере порта другой стороны, получая к ней доступ, а также могут регистрировать на нем свою собственную информацию об IP-адресе внешней сети и номере порта. . Таким образом, здесь A и B могут знать информацию об адресах связи друг друга до связи.
Если тип NAT A:
- Независимо от того, какой у B тип A/B/C/D, B может напрямую отправлять данные на eAddr:port A, и когда A получает данные от B, он также может получить eAddr2:port2 от B и отправлять данные на B. Квалификация для отправки данных, тем самым устанавливая двустороннюю связь.
Если тип NAT A — B:
- Когда тип NAT B — B/C/D: A использует сначала
192.168.1.1:10001
=>1.1.1.1:10002(甲外网出口)
=>2.2.2.2:20002(乙外网入口)
Попытка отправить данные в B отклонена B, но запись о доступе остается на маршрутизаторе B, так что B имеет возможность отправлять данные в A. И когда B завершит отправку данных, это позволит A получить возможность отправлять данные B, тем самым установив двустороннюю связь. - Когда тип NAT B - A, та же логика, что и когда A - A
Если тип NAT A - C :
- Когда тип NAT B равен D: B будет отклонен при попытке подключения к A, и A не может знать, какой номер порта сопоставлен B, поэтому он не может подключиться к B. Связь в любом направлении установить не удалось.
- Когда тип NAT для B — B: соединение C-B такое же, как соединение B-C выше.
- Когда тип NAT B — C : разница между C-C и C-B/B-C заключается в том, что экспортные порты обеих сторон всегда должны быть согласованы, и требования более строгие, но двусторонняя связь все же может быть установлена.
- Двусторонняя связь также может быть установлена, когда тип NAT B — A.
Если тип NAT A равен D:
- Когда тип NAT для B - D: Связь в любом направлении не может быть установлена.
- Когда тип NAT для B — C: с C-D, связь в любом направлении не может быть установлена.
- Когда тип NAT для B — A/B: с A-D и B-D может быть установлена двусторонняя связь.
Подводя итог, можно сделать следующие выводы:
- Только комбинация C-D, DC и D-D не имеет возможности установить двустороннюю связь, а другие комбинации могут иметь возможность двусторонней связи на уровне NAT.
- Плеер типа A/B теоретически не должен иметь проблем с NAT для любого другого типа плеера.
Конечно, все вышесказанное — это теории, и можно ли это на самом деле подключить на практике, зависит от других сетевых условий и даже логики программирования.
Как Dongsen подключается к сети?
Многие консольные игры имеют очень странные или даже причудливые настройки, когда они находятся в сети, эти настройки связаны с механизмом синхронизации и проблемами с онлайн-сетью, упомянутыми выше.
В онлайн-режиме Dongsen также есть много интересных (раздражающих) настроек, таких как:
- Украшение острова нельзя изменить в онлайне.
- Когда игрок отправляется на остров, всем потребуется длительная пауза, чтобы дождаться его успешного присоединения.
- Когда игрок уходит, все также должны смотреть, как он уходит синхронно, а прогресс данных текущего момента будет сохраняться при выходе.
- Когда игрок отключается/выходит принудительно, все данные будут откатываться до версии, когда игрок приземлялся на остров/уходил нормально
- Когда игрок на острове открывает окно диалога, люди не могут покинуть или войти на остров в обычном режиме.
Следующий анализ — это всего лишь мое предположение о реализации Dongsen, основанное на моем опыте разработки программного обеспечения после 200 часов игры. Никто не может гарантировать абсолютную правильность этой догадки, не читая код, к тому же меня больше волнует счастье процесса угадывания, чем правильность, поэтому каждый может думать больше с инженерной точки зрения, а не беспокоиться о том, действительно ли это так. Это достигается.
Мы можем разделить процесс онлайн-игр на следующие разделы, чтобы обсудить отдельно:
1. А открывает онлайн-разрешение (так называемое открытие дверей) и использует свой собственный хост в качестве хоста
На этом шаге А установит свой собственный IP-адрес внешней сети и номер порта (например,1.1.1.1:10001
) зарегистрирован в онлайн-сервисе Switch.
2. B находит A через поиск и пытается присоединиться
-
B использует онлайн-сервис, чтобы сначала установить свой собственный IP-адрес внешней сети и номер порта (например,
2.2.2.2:10002
) зарегистрироваться. (то есть шаг в игре, который спрашивает, хотите ли вы подключиться) -
Затем получите A, выполнив поиск
1.1.1.1:10001
(то есть шаг поиска друзей в Motion Forest), попробуйте подключиться.Обратите внимание, что в это время хост A также знает, что B подключается к нему через онлайн-сервис в фоновом режиме, и A также будет использовать хост B.
2.2.2.2:10002
Перейдите на ссылку B и попробуйте установить двустороннюю связь.
3. Совершите подключение, отправляйтесь на остров
Когда вышеуказанный шаг подтвердит, что двусторонняя связь может быть установлена, вы можете начать идти на остров. На острове делится на следующие этапы:
3.1 Хост упаковывает все текущие игровые состояния
Перед тем, как отправиться на остров, хост А сделает снимок всех игровых данных на текущий момент.
Содержимое данных моментального снимка здесь включает данные острова и данные игрока.
3.2 Загрузите снимок острова другой стороны
При перемещении по острову будет всплывать анимация, показывающая прогресс.Процесс этой анимации заключается в загрузке данных снимка целевого острова.Очевидно, что если есть игроки в Китае и США, процесс будет очень долго. Это связано с трансграничной сетью, вызванной медлительностью.
3.3 Другие синхронно ждут, пока новый игрок не прибудет на остров
Причина, по которой другим игрокам приходится ждать прихода новых игроков на остров, заключается в том, что снимок, сохраненный на предыдущем шаге, должен быть последним результатом, что также означает, что другие игроки больше не могут выполнять инкрементные операции, иначе состояние новых игроков будет непоследовательным, когда они приземлятся на острове.
4. Запустите игру
Когда остров будет завершен, вы сможете начать игру в обычном режиме. На этот раз встанет проблема, как синхронизировать данные плееров, работающих друг с другом.
Здесь мы делим действия игрока на два типа:
- Влияет на игровые данные (низкая частота, есть требования по времени, нужно разместить)
- Влияет на игровой экран, но не влияет на игровые данные (высокая частота, отсутствие требований по времени, нет необходимости сбрасывать диск)
Если вы внимательно это прочувствуете, то обнаружите, что когда мы копаем ямы, разговариваем с NPC, бросаем предметы и выполняем другие операции, которые напрямую влияют на глобальные игровые данные, иногда возникает задержка, потому что эти операции, влияющие на глобальные данные состояние рендеринга Перед экраном вам нужно сначала запросить разрешение хоста.Если есть дрожание сети, будет зависание/сбой. Однако, когда мы бежим, мы редко застреваем, но иногда будут "флэшбеки", потому что бег влияет только на текущую позицию игрока и не влияет на игровые данные. не нужно форсировать Гарантированное время. Более того, если вам нужно перейти на сторону хоста, чтобы попросить запустить, это приведет к тому, что весь игровой процесс сильно застопорится. Однако, если данные неупорядочены или синхронизация неупорядочена в таких операциях, как удаление элементов, все состояние будет несогласованным, что может быть очень серьезно.
Таким образом, метод синхронизации здесь представляет собой пошаговую синхронизацию. Просто для низкой частоты и высокой частоты сделаны отдельные стратегии.
5. Плеер выходит/принудительно выходит/отключается
Если игрок нормально выходит из игры, активируется интерфейс «сохранения данных». Чтобы понять смысл этих сохраненных данных, мы должны разделить данные в игре на две категории:
- состояние острова
- Данные о каждом действии каждого игрока
Прежде всего, для консольных игр действительно действительные данные должны быть окончательно помещены в локальное хранилище консоли. Но представьте, что если каждое обновление запускает обновление локального хранилища хоста проигрывателя, откат в это время станет чрезвычайно проблематичным, не говоря уже о том, что дисковый ввод-вывод также очень медленный. Таким образом, более вероятная реализация здесь заключается в том, что авторитетные данные текущей игры, включая статус острова и операции игрока, хранятся в памяти хоста-хоста. Кроме того, независимо от того, как игрок выходит, мы должны убедиться, что после окончания игры все локальные сохранения игроков плюс сохранения на хост-узле являются реальным состоянием игры в определенный момент времени. Правильность игровых данных имеет приоритет над пользовательским опытом. Ниже приведены примеры, иллюстрирующие важность этого.
Когда игрок нормально выходит и запускает «сохранение данных», хост-хост сначала открывает снимок текущего момента, а затем хост каждого игрока загружает принадлежащие ему операционные данные с хост-хоста и размещает их локально.
Однако, когда игрок аварийно завершает работу из-за того, что он не загрузил принадлежащие ему данные, его локальные игровые данные по-прежнему остаются в последней сохраненной точке времени T1.Чтобы обеспечить гарантию правильности данных, о которой мы упоминали ранее, хотя остров The другие игроки не отключены, и их внутриигровой статус является последними и правильными данными, но для того, чтобы данные этого парня были правильными, данные всех остальных должны быть отброшены к времени T1, поэтому Донгсен сбросит линию и отступить.
Общая проблема
Онлайн-сервисы Nintendo — мусор?
Из приведенного выше объяснения можно понять, что за этими, казалось бы, странными онлайн-опытами действительно стоит много технических трудностей. И Nintendo, в конце концов, игровая компания, а не профессиональная компания распределенных баз данных.Хотя в текущем плане технической реализации есть много областей для улучшения, необходимо учитывать рентабельность инвестиций, поэтому говорить о «мусоре» все же недостаточно.
Почему производители игр не создают свои собственные серверы, чтобы улучшить впечатления?
Геймеры приезжают со всего мира.Если вы хотите создать свой собственный сервер для улучшения опыта, вам придется создавать серверы по всему миру, что довольно дорого и сложно реализовать. Это правда, что будут решения для одного и того же глобального сервера, но, как правило, такие компании, как онлайн-игры, которые полагаются на сети, чтобы зарабатывать деньги, имеют возможность и желание принять их. Бизнес-модель консольных игр обречена на то, что они не будут тратить очень большие деньги на улучшение работы в сети. Конечно, другое дело, если производитель хоста сам настроит глобальный сервер.
использованная литература
- Wikipedia: Network address translation
- Peer-to-Peer (P2P) communication across middleboxes
- Обзор технологии синхронизации онлайн-игр
Добавить Автора