2015-04-21 2 views
1

Я развиваю игру в реальном времени с помощью набора Sprite Kit и Game Kit. В игре есть многопользовательский режим, в котором 4 игрока могут играть друг с другом. Я читал руководство Game Kit программирует и наткнулся на следующий пассаж:Оптимизация сетевой топологии одноранговой сети 4 игрока

Хотя объект GKMatch создает полное соединение равноправных узлов ЛВС между всеми участниками, вы можете уменьшить сетевой трафик Наложение кольцевой или клиент-серверной архитектуры сети поверх нее. На рисунке 8-1 показаны три возможных сетевых топологии для игры с четырьмя игроками . Слева, одноранговая игра имеет 12 соединений между различными устройствами. Тем не менее, вы могли бы сложить архитектуру клиент-сервер , указав одно из устройств на роль хоста. Если ваша игра будет передаваться только на хост или с него, вы можете уменьшить число соединений . Кольцевая архитектура позволяет устройствам пересылать сети пакеты только на следующее устройство, но дополнительно уменьшает количество подключений . Каждая топология обеспечивает отличную производительность , поэтому вы захотите протестировать разные модели, чтобы найти один , который обеспечивает производительность, которую требует ваша игра.

enter image description here

Так вот где я запутался. В настоящее время в моей игре я реализовал одноранговую топологию, где каждый пользователь отправляет свою позицию каждому другому игроку в игре. В результате получается всего 12 отправленных сообщений, так как каждый игрок отправляет 3 сообщения.

Однако, согласно документации, если я накладываю топологию клиент-сервер на свою игру, я могу уменьшить сетевой трафик, уменьшив количество подключений. Если я это сделаю, то каждый клиент отправит свою позицию на хост, а затем хост должен будет передать эти позиции оставшимся клиентам. Итак, теперь одному игроку (хозяину) нужно работать дополнительно, потому что клиенты больше не общаются друг с другом. И тогда мы все еще получаем 12 сообщений. Хост отправляет 9 сообщений (3 сообщения для каждого игрока, а также 6 сообщений для ретрансляции позиций других клиентов), затем каждый клиент отправляет 1 сообщение о местоположении на хост. 9 + 1 + 1 + 1 = 12 сообщений. Что имеет смысл, все, что мы делали, это неравномерно распределить отправку сообщений, так что теперь одному игроку нужно больше работать над тем, чтобы сделать меньше работы другими игроками.

Кроме того, ретрансляция клиентских сообщений занимает дополнительное время, так как позиция каждого клиента теперь должна проходить через хост.

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

Так может кто-нибудь объяснить мне, как сетевой трафик снижается путем разбиения топологии клиент-сервер? Разве только факт наличия меньшего количества соединений в матче снижает сетевой трафик, хотя общие сообщения одинаковы? Имейте в виду, здесь нет выделенного сервера, я (и документация) говорю о разделении топологии клиент-сервер поверх сопоставления одноранговой сети. Кроме того, у хозяина больше шансов отключиться, потому что он отправляет 3 раза больше сообщений, чем другие игроки. В конце концов, GKMatch отключит плеер после короткого периода потери пакетов. Или просто факт наличия 12 соединений имеет больший шанс для разъединений из-за якобы увеличенного трафика?

ответ

1

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

+0

2 Вопросы: 1) Не будет ли только одно сообщение. Это лучше, чем отправка нескольких небольших пакетов? 2) Что касается сообщений о действиях. То есть игрок делает что-то вроде побегов или лечит и т. д. Я не могу собрать что-то подобное. Возможно, цитируйте это и ответьте в своем ответе, если у вас недостаточно места. –

+0

1) В большинстве случаев да, это лучше. Подумайте о накладных расходах, связанных с отправкой каждого сообщения. 2) Извините, я не понимаю, почему нет? – wookie919

+0

Позиция отправляется каждые x секунд, поэтому я могу просто отправить сервер одному сообщению всех позиций каждому клиенту. Но действия могут появиться в любое время, нет интервала. И есть много разных типов действий. Я полагаю, сервер мог «слушать» и собирать действия, которые посылал каждый игрок, а затем отправлять один комбинированный пакет каждому клиенту. Но окно прослушивания должно быть настолько маленьким, чтобы предотвратить отставание, что никакая коллекция не может произойти, если только 2 игрока не отправили действие одновременно. Разве вы не можете придумать лучшее решение этого? Благодарю. –