Проблемы с сетью в играх

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

Плохая сеть

Сообщения, отправленные клиентами, достигают сервера через некоторое время. Сервер не может просто обработать их FCFS, потому что это несправедливо по отношению к игрокам с более высокой задержкой. Частичным решением для этого были бы временные метки в сообщениях, но для этого вам понадобятся 2 вещи:

  • Уметь доверять часам клиентов. (Думаю, это невозможно.)
  • Постоянные задержки, которые вы можете измерить. Что вы можете сделать с переменной задержкой?

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

В играх MMO сервер обслуживает большое количество клиентов. Как лучше всего распределять нагрузку? На основании местоположения в игре? Привязывать группы клиентов к серверам? Можно ли избежать отправки всего через сервер?

Игроки уходят

Когда это происходит, я видел 2 разных варианта поведения. В большинстве игр FPS, если игрок, который разместил игру (я предполагаю, что он сервер), уходит, другие не могут играть. В большинстве игр RTS, если один из игроков уходит, остальные могут продолжать играть без него. Как это возможно без выделенного сервера? Все знают полное состояние? Они как-то передают роль сервера?

Доступ к информации

Следующую проблему можно решить с помощью выделенного сервера, но мне любопытно, можно ли это сделать без него. Во многих играх игроки не должны знать полного состояния игры. Туман войны в RTS и стены в FPS - хорошие примеры. Однако им нужно знать, действительно ли действие. (Например, можете ли вы стрелять в меня оттуда или находитесь на другой стороне карты.) В этом случае клиентам необходимо подтвердить изменения в неизвестном состоянии. Это похоже на то, что можно решить с помощью умного использования криптографических примитивов. Любые идеи?

Жульничество

Некоторые из вышеперечисленных проблем легко решить в среде доверенного клиента, но этого нельзя предполагать. Существуют ли решения, которые работают, например, в среде 80% обычных пользователей - 20% читеров? Можно ли создать античит-программу, которая работает (и не требует таких нелепых вещей, как модули ядра)?

Я прочитал эти вопросы и некоторые ответы https://stackoverflow.com/questions/901592/best-game-network-programming-articles-and-books, но в других ответах есть ссылки на недоступный / ограниченный контент. Это вопрос, не зависящий от платформы / ОС, но также приветствуются решения для конкретных платформ / ОС.


person stribika    schedule 23.09.2010    source источник
comment
Может, этот сайт больше подходит для ответа на этот вопрос? gamedev.stackexchange.com   -  person Nakilon    schedule 24.09.2010


Ответы (4)


Думать, что криптография решит такие проблемы, - очень распространенная и очень серьезная ошибка: конечно, сам клиент должен уметь ее расшифровать, поэтому это совершенно бессмысленно. Вы не добавляете безопасность, вы просто добавляете неясности (и это будет взломано).

Мошенничество слишком специфично для игры. Есть какие-то игры, в которых его нельзя полностью устранить (прицеливание ботов в FPS), а в некоторых, если вы не облажались, вообще невозможно (серверные ходовые игры).

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

person o0'.    schedule 23.09.2010
comment
Я знаю, что простое шифрование состояния не сработает, но я видел несколько очень интересных применений криптографии. Например, проверка результатов голосования, не зная, кто за что проголосовал, или шифрование, для расшифровки которого требуется несколько сторон. Может быть, здесь можно использовать что-то подобное. Это довольно просто, как только вы это увидите, но очень сложно понять, как это сделать в противном случае. - person stribika; 24.09.2010
comment
Мне нравится статья, в которой много подробностей о компенсации задержки. - person stribika; 24.09.2010

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

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

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

Серверу вообще не нужно гадать - он знает состояние. Клиенту нужно только догадываться, пока соединение не работает - когда оно будет восстановлено, ему будет отправлено новое состояние.

В играх MMO сервер обслуживает большое количество клиентов. Как лучше всего распределять нагрузку? На основании местоположения в игре?

Нет "лучшего пути". Однако географическое разделение работает довольно хорошо.

Можно ли избежать отправки всего через сервер?

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

В большинстве игр RTS, если один из игроков уходит, остальные могут продолжать играть без него. Как это возможно без выделенного сервера? Все знают полное состояние?

Многие игры RTS поддерживают полное состояние одновременно на всех машинах.

Некоторые из вышеперечисленных проблем легко решить в среде доверенного клиента, но этого нельзя предполагать.

Большинство игр, открытых для публики, должны предполагать 100% читерскую среду.

person Kylotan    schedule 24.09.2010

Плохая сеть

Игрокам с высокой задержкой следует купить новый модем. Я не думаю, что это хорошая идея - увеличивать задержку, потому что у одного человека в игре плохое соединение. Или, если вы имеете в виду незначительные различия в задержке, кого это волнует? Вы только сделаете вещи медленнее и сложнее, если откажетесь от FCFS.

Мошенничество: прицельные боты и тому подобное

Можете ли вы действительно создать работающую античит-программу? Нет, ты не можешь. Вы не можете знать, запускают ли они вашу программу или другую программу, которая действует как ваша.

Обман: доступ к информации

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

Есть несколько игр, в которых криптография может предотвратить мошенничество. Карточные игры, такие как покер, где каждый игрок может «перетасовать колоду». Подробности в википедии: Mental Poker.

Теоретически вы можете зашифровать свою часть игрового состояния с помощью RTS или FPS. Затем отправьте его всем и отправляйте ключи дешифрования только для тех частей, которые им разрешено видеть или когда им разрешено это видеть. Однако я сомневаюсь, что в 2010 году мы сможем делать это в реальном времени.

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

Если вы не создаете покерный сайт, мошенничество в любом случае не будет для вас самой большой проблемой.

person Ishtar    schedule 23.09.2010
comment
Дело не только в новых модемах. Физическое расстояние до сервера тоже играет важную роль, также как и интернет-провайдер. Понятно, что нам нужно какое-то ограничение на то, сколько задержки мы готовы добавить. Игрок с 5-секундным RTT не сможет играть ни за что, так зачем же испортить игру для других 5. Но (в зависимости от игры) некоторая задержка допустима. В играх с FPS приемлемая задержка очень низкая, а допуск на различия очень низок (очень важно, кто выстрелил первым). В других играх допуски для обоих выше. Я думаю, что если вы можете сохранить приемлемую задержку, вы также можете сделать ее равной. - person stribika; 24.09.2010
comment
Думаю, я согласен с тем, что прицеливания неизбежны. Однако те, что я видел, определенно можно обнаружить, они играют совсем не как люди. Конечно можно отрегулировать ... - person stribika; 24.09.2010

Поскольку многие люди получают доступ к играм на мобильных устройствах, "плохая сеть" может возникнуть, когда игрок находится в зоне плохого приема или он подключен к медленному Wi-Fi-соединению. Так что проблема не только в подключении людей в малонаселенных районах. С мобильными клиентами "плохие сети" могут возникать очень и очень часто, и это, как правило, ЧРЕЗВЫЧАЙНО трудно диагностировать.

UDP приводит к потере пакетов, но даже в играх, использующих TCP и HTTP, могут возникать проблемы, когда связь между клиентом и сервером замедляется до обхода, пока пакеты проверяются на отправку. С коммуникацией UDP компенсация потери пакетов ОБЫЧНО зависит от того, что содержат пакеты. Если вы говорите о данных движения, обычно, если пакеты не получены, сервер интерполирует предыдущую траекторию и изменяет положение. Обычно в игре принято, как это обрабатывается, поэтому люди часто избегают UDP, если их тип игры не требует этого. Часто, чтобы справиться с высокой задержкой в ​​сети, проблемные игры автоматически уменьшают количество функций, доступных пользователям, чтобы они по-прежнему могли взаимодействовать с игрой, не заставляя пользователя быть выгнанным или испытать слишком много неработающих функций.

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

Уход игроков. В наши дни в большинстве игр есть выделенные серверы, поэтому этот вопрос в основном не обсуждается. Однако иногда да, сервер можно поменять на другого клиента.

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

person King Zaphod    schedule 30.08.2014