Я строю MMO и хочу добавить NPC. Дело в том, что я не знаю основной дизайн. При чем тут расчеты, клиенты или сервер? Я бы понял сервер, вычисляющий события и реакции, но когда дело доходит до определения пути, положения и движения игрока, кто это вычисляет?
Кто рассчитывает ИИ сервер или клиент? Я не мог себе представить сервер, вычисляющий поиск пути, положение, движение и так далее. Пожалуйста, мне нужна помощь, чтобы понять это, спасибо, все поможет.
Ответы:
В наши дни большинство НММ выполняют что-то важное на стороне сервера по соображениям безопасности. Вы не можете много разгрузить клиенту, поэтому одной из первых вещей, на которые стоит обратить внимание, являются процедуры ИИ. Я думаю, что большинство разработчиков считают, что клиентская сторона, как правило, является взломанной, а не исключением.
Badumna от Scalify ( http://www.scalify.com/badumna.php ) пытается разгрузить часть ее на клиентах, чтобы они выполняли вычисления на стороне клиента и отправляли друг другу; некоторые данные также отправляются авторизованному узлу для проверки перед передачей клиентам, как выделенный сервер. Проблема в том, что ВСЕ данные в многопользовательской игре ДОЛЖНЫ быть отправлены через авторитетного партнера, если вы хотите предотвратить мошенничество. Я поднял Badumna, поскольку он казался самым близким к тому, что вы могли бы хотеть, но даже это не сможет поймать мошенников - они могут поймать некоторых, но все критическое (то есть все, в значительной степени) должно быть выполнено на сервере - боковая сторона.
Я мог бы немного рассказать о Badumna, потому что это все еще может быть чем-то полезным для вас (но я призываю вас пересмотреть разгрузку всего, что важно для клиентов, потому что клиенты будут обманывать).
Badumna предлагает гибридную архитектуру для операций с данными. Он обеспечивает полный контроль разработчика при принятии решения о том, что является критичным (и должно быть проверено), а что нет (и поэтому может быть отправлено децентрализованной сетью).
Если MMO требует проверки каждого отдельного бита информации, Badumna будет функционировать как решение клиент-сервер. Тем не менее, я считаю, что существуют разные категории приложений MMO с различными требованиями. Например, довольно часто MMO будет иметь боевые зоны, где игроки могут обманывать, и, следовательно, каждый бит информации должен быть проверен. Однако есть также зоны, где игроки могут только гулять / бегать / танцевать / общаться. Такие зоны не требуют полной проверки и могут использовать децентрализованную сеть Badumna и пользоваться масштабируемостью, которую она может предложить.
Во-вторых, Badumna предоставляет дополнительные функции безопасности, к которым разработчики могут получить доступ, такие как защита идентификационных данных (чтобы пользователи не могли притворяться кем-то другим), прокси-сервер для жалоб (позволяющий настраивать клиентов для сообщения о злонамеренных / обманных игроках в надежный источник) и черный список (запрещение вредоносных игроков из игр).
Я не так много изучал Бадумну, так что могут быть проблемы и особенности, о которых я не знаю, но, по крайней мере, я бросил беглый взгляд на это.
tl; dr: клиент должен быть просто клавиатурой и мышью, подключенной к интернету.
источник
Короткий ответ: для стандартной MMO вычисления AI всегда выполняются сервером.
В некоторых играх клиент будет пытаться предсказать ИИ, так что NPC будут реагировать быстрее, но это всего лишь иллюзия; настоящий NPC всегда контролируется сервером.
источник
MMO - это общедоступный (интернет) сервер. Все, что вы хотите полностью контролировать, не должно быть общедоступным, иначе вы рискуете позволить злоумышленнику контролировать неигровых персонажей. Если вы не выполняете какое-либо шифрование в своих командах (что повлияет на производительность), вы не сможете доверить клиенту выполнение только вашего собственного кода.
Предсказание движений NPC на клиенте для компенсации отставания - отличная идея; теоретически вы можете включить в клиентскую программу столько поведения ИИ, сколько захотите, и периодически синхронизировать его, но если клиент может диктовать поведение неигрового персонажа, это даст клиенту возможность связываться с игровым миром. Если клиент десинхронизируется из игрового мира на сервере, то вы получите неконтролируемых мошеннических NPC.
Это действительно позор, потому что распределение ИИ по клиентам может повлиять на масштабируемость.
источник
Обычно сервер должен рассчитывать или проверять все данные, переданные или полученные от клиента. Но это зависит от того, насколько вы можете доверять клиенту и насколько важен этот расчет. Иногда основные вычисления могут выполняться на клиенте, и сервер может использовать простой метод для проверки полученных данных.
источник
Чтобы опираться на другие ответы, стратегия «разгрузить и проверить» действительно может быть полезна в ситуациях, когда проверка проще, чем первоначальный расчет (или когда для отлова мошенников будет достаточно лишь случайных выборочных проверок).
Например, если у вас был клиент, выполняющий A * pathfinding и отправляющий результаты на сервер, все, что нужно было бы серверу, - это проверить, что a) путь действителен, и b) нет более короткого пути. Проверка правильности пути должна быть простой, а проверка оптимальности может быть проще, чем поиск оптимального пути для начала, поскольку теперь у вас есть верхняя граница длины путей, которые необходимо проверить. (В частности, если клиент возвращает прямолинейный путь, он, очевидно, является оптимальным, если он действителен.) Честно говоря, я понятия не имею, будет ли этот конкретный прием полезен на практике, но я не вижу принципиальных препятствий. к этому.
Учтите, однако, что если вы разгрузите ИИ NPC на клиентов, то взломанный клиент потенциально может использовать его, чтобы заранее предсказать поведение NPC. Для некоторых типов игр или ситуаций это может быть серьезной проблемой.
источник
Вероятно, лучше всего иметь некоторые простые процедуры ИИ и вычисления, важные для игры, на стороне сервера, в то же время обрабатывая сложные не критичные для игры операции на стороне клиента.
Например, сервер знает, где находится враждебный NPC и где находятся персонажи игрока. Когда персонаж игрока попадает в радиус действия NPC, можно выполнить вычисления на стороне сервера, чтобы увидеть, должен ли NPC атаковать игрока, и можно выполнить простую маршрутизацию поиска пути, чтобы определить, сколько времени потребуется NPC, чтобы добраться до игрока.
После того, как NPC был переведен в состояние атаки, клиент может заняться анимацией и детальным поиском пути. Когда NPC находится достаточно близко к клиенту, чтобы атаковать, сервер может выполнить вычисления, чтобы увидеть, ударила ли атака, какой урон был, и т.д ...
Вы должны убедиться, что любые вычисления, которые действительно влияют на результат игры, обрабатываются сервером и передаются клиенту, а некритические вычисления обрабатываются клиентом.
В простейшем случае вы будете синхронизировать клиент с тем местом, где он ожидает, сервер проверит, а затем клиент снова выполнит вычисления.
источник