Эффективное решение для многопользовательского разделения пространства?

10

Этот вопрос немного сложен, но я постараюсь прояснить его.

Допустим, я создаю онлайн-игру (не в масштабе MMO), но она поддерживает как можно больше игроков в рамках авторитетного серверного подхода. Я хочу действительно большие миры с большим количеством искусственных врагов.

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

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

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

Гримшоу
источник
Вы ограничены только одним физическим сервером?
Патрик Хьюз
В конечном итоге нет. Но ради простоты и достижимости, сейчас я не могу усложнить проект еще больше :)
Гримшоу
Начните просто. Нечто подобное WoW, которое работает с несколькими физическими блоками на «сервер», просто делит их мир на сетку, и все обновления основаны на том, кто находится в тех же блоках, что и вы. Очень просто, легко настраивается, хорошо работает, и вы можете использовать его только с одним блоком для управления обработкой.
Патрик Хьюз
Я полностью согласен с вашей точкой зрения, и, возможно, я что-то упустил в своем вопросе. Что если один игрок находится в самой правой части ячейки бокса, а другой - в самой левой от правой соседней ячейки? Они должны видеть друг друга! Мир выглядит по-прежнему для такой игры, как WoW. Я не понимаю, как создать непрерывную сетку мира, сохраняя при этом ее эффективность? Конечно, бывают ситуации, когда игроки с двух «серверов» должны видеть друг друга :)
Grimshaw
1
И да, если у вас будет много материала и много игроков, вам действительно нужно планировать, чтобы все было активно везде и всегда, никакого волшебного пути вокруг этого. Вот почему отдельные блоки группы серверов MMO обслуживают максимум 200-500 игроков И почему MMO AI для NPC является патетически глупым (он же дешевый для вычислений).
Патрик Хьюз

Ответы:

5

Из того, что я понимаю, на вашем сервере будет работать какая-то физика.

Если это так, есть и другие методы, доступные для ИИ / физики, кроме разделения пространства. От самого к менее очевидному:

  • Приоритет: NPC, не имеющие прямого взаимодействия с игроками, могут получать меньше процессорного времени за счет снижения частоты их обновления. Вы можете использовать приоритетные очереди и запускать очереди с более высоким приоритетом от первого до последнего, в то время как другие очереди будут запускать только 1/2, 1/4 или 1/8 очереди в каждом цикле. таким образом вы гарантируете, что каждый объект работает в определенный момент, но вы уменьшаете количество раз, которое он потребляет ЦП.
  • физика также может быть снижена (можно использовать только коробки столкновений и сферы в роуминге и вдали от поля зрения).
  • упрощение ИИ / симуляции путем распределения очень простых поведений для NPC и окружения, пока игроки находятся далеко. Обычно это будет роуминг или поиск врагов, а не охота, собирательство, сельское хозяйство ...
  • некоторая физика и ИИ также могут быть переданы клиентам. Если вам действительно не хватает ЦП на серверах, вы можете пометить объект как частично разрешенный, и клиенты будут корректировать физику и положение этих объектов локально (чтобы избежать плавающих NPC). На клиентов может быть возложена некоторая ответственность за запуск ИИ (во время боя с игроком устройство целевого игрока может напрямую запускать атакующих NPC)
  • для игроков физика также может быть снижена на сервере, и клиенты получат больше ответственности за разрешение конфликтов. Пример: вы ударили объект своим транспортным средством, сервер только разрешит столкновение на ящиках столкновения и пометит объекты как потенциально в столкновении. Клиент отправит разрешение на сервер с отметкой времени, которая примет его, если объекты помечены и решение кажется правильным.

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

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

Также в отношении физики вы должны взглянуть на библиотеки, которые поддерживают какую-то систему GPGPU , такую ​​как OpenCL или CUDA, если у вас есть доступ к серверу, который поддерживает либо.

койот
источник
Комбинирование пространственного разбиения региона с приоритетными обновлениями должно быть именно тем, что мне нужно, оптимально для небольшого количества игроков и все же оптимизировано, когда загружено много областей. Спасибо.
Гримшоу
@DevilWithin Это должно помочь, и это не требует никаких изменений на стороне клиента. Я также добавил еще несколько деталей в ответ.
Койот
Упрощенный ИИ - прекрасная идея. Хотя NPC находятся далеко от игроков, им не нужно ничего делать, кроме перемещения в большинстве случаев. Это означает, что я могу просто приблизиться к тому, что они планируют, каждую минуту или что-то в этом роде, просто чтобы заставить их бродить по миру ... представляя их зомби, они будут делать это!
Гримшоу