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

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

Плохая сеть

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

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

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

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

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

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

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

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

Мошенничество

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

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

Я делаю это в Linq-to-SQL, и я не знаю, как динамически составлять предикат на основе произвольно длинного списка подпредикатов. Для известного количества предложений легко составить предикаты вручную:

dataContext.Customers.Where(
    ( 
      Customer.Forenames.Contains("keyword1") 
      ||
      Customer.Forenames.Contains("keyword2")
    ) && (
      Customer.Surname.Contains("keyword1") 
      ||
      Customer.Surname.Contains("keyword2")
    )
);

Короче говоря, мне нужен метод, который, учитывая два предиката, вернет один предикат, составляющий два исходных предиката с предоставленным оператором, но ограниченный операторы, явно поддерживаемые Linq-to-SQL. Есть идеи?

5
задан Community 23 May 2017 в 11:50
поделиться