Я ищу сетевые разработки и приемы, характерные для игр. Я знаю о некоторых проблемах, и у меня есть некоторые частичные решения для некоторых из них, но могут быть проблемы, которых я пока не вижу. Я думаю, что на этот вопрос нет однозначного ответа, но я приму ответ, который мне очень нравится. Я могу выделить 4 категории проблем.
Плохая сеть
Сообщения, отправленные клиентами, достигают сервера через некоторое время. Сервер не может просто обработать их FCFS, потому что это несправедливо по отношению к игрокам с более высокой задержкой. Частичным решением для этого были бы временные метки в сообщениях, но для этого вам понадобятся 2 вещи:
- Уметь доверять часам клиентов. (Думаю, это невозможно.)
- Постоянные задержки, которые вы можете измерить. Что вы можете сделать с переменной задержкой?
Многие игры используют UDP, что означает, что сообщения могут быть потеряны. В этом случае они пытаются оценить состояние игры на основе уже имеющейся информации. Как узнать, правильное ли оценочное состояние или нет, после того, как соединение снова заработает?
В играх MMO сервер обслуживает большое количество клиентов. Как лучше всего распределять нагрузку? На основании местоположения в игре? Привязывать группы клиентов к серверам? Можно ли избежать отправки всего через сервер?
Игроки уходят
Когда это происходит, я видел 2 разных варианта поведения. В большинстве игр FPS, если игрок, который разместил игру (я предполагаю, что он сервер), уходит, другие не могут играть. В большинстве игр RTS, если один из игроков уходит, остальные могут продолжать играть без него. Как это возможно без выделенного сервера? Все знают полное состояние? Они как-то передают роль сервера?
Доступ к информации
Следующую проблему можно решить с помощью выделенного сервера, но мне любопытно, можно ли это сделать без него. Во многих играх игроки не должны знать полного состояния игры. Туман войны в RTS и стены в FPS - хорошие примеры. Однако им нужно знать, действительно ли действие. (Например, можете ли вы стрелять в меня оттуда или находитесь на другой стороне карты.) В этом случае клиентам необходимо подтвердить изменения в неизвестном состоянии. Это похоже на то, что можно решить с помощью умного использования криптографических примитивов. Любые идеи?
Жульничество
Некоторые из вышеперечисленных проблем легко решить в среде доверенного клиента, но этого нельзя предполагать. Существуют ли решения, которые работают, например, в среде 80% обычных пользователей - 20% читеров? Можно ли создать античит-программу, которая работает (и не требует таких нелепых вещей, как модули ядра)?
Я прочитал эти вопросы и некоторые ответы https://stackoverflow.com/questions/901592/best-game-network-programming-articles-and-books, но в других ответах есть ссылки на недоступный / ограниченный контент. Это вопрос, не зависящий от платформы / ОС, но также приветствуются решения для конкретных платформ / ОС.