Ефективне рішення для розділення простору для кількох гравців?


10

Це питання трохи хитромудрий, але я спробую це зрозуміти.

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

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

Проблема полягає в тому, що регіон може стати досить великим і мати безліч NPC, що імітують одразу. Як мені впоратися з цим, не впливаючи на досвід гравців? Підходи, такі як один сервер на один регіон, так і не є в таблиці.

Я в основному шукаю структури даних для утримання орди ворогів і навіть мирних НПС. Щоб остаточно поставити питання, зауважте, що транспортні засоби існують, тому його значно швидко подорожувати в межах регіону, впливаючи на "коли", щоб скинути місця.


Ви обмежені лише одним фізичним сервером?
Патрік Х'юз

Зрештою, ні. Але заради простоти та досяжності, наразі я не можу ще більше ускладнити проект :)
Grimshaw

Почати просто. Щось на зразок WoW, який працює на декількох фізичних коробках на "сервері", просто ділить їх світ на сітку, і все оновлення базується на тому, хто знаходиться в тих же полях, що і ви. Дуже просто, легко підлаштовується, працює добре, і ви можете використовувати його лише для одного коробки для управління обробкою.
Патрік Х'юз

Я повністю згоден з вашою точкою зору, і, можливо, я щось пропустив у своєму питанні. Що робити, якщо в правій частині клітинки поля є один гравець, а інший - в лівій частині клітини правого сусіда? Вони повинні бачити один одного! Світ виглядає продовжуючи таку гру, як WoW .. Це те, чого я не розумію, як зробити суцільну світову сітку, зберігаючи її ефективної? Звичайно, бувають ситуації, коли гравці з двох "серверів" повинні бачити один одного :)
Grimshaw

1
І так, якщо у вас буде багато і багато речей, так і багато гравців, ви дійсно повинні планувати, щоб все було активним скрізь і весь час, ніякого магічного шляху цього не робити. Ось чому окремі коробки групи серверів MMO обслуговують максимум 200-500 гравців І чому MMO AI для NPC патетично нерозумно (він же дешевий для обчислення).
Патрік Х'юз

Відповіді:


5

З того, що я розумію, у вас на сервері буде працювати якась фізика.

Якщо це так, є також інші методи, доступні для AI / фізики, крім розділення простору. Від більшості до менш очевидних:

  • пріоритет: NPC без прямої взаємодії з гравцями можуть отримувати менший час процесора, знижуючи частоту оновлення. Ви можете використовувати черги з пріоритетом і запускати черги з вищим пріоритетом від першої до останньої, тоді як інші черги працюватимуть лише 1/2, 1/4 або 1/8 черги кожного циклу. таким чином ви гарантуєте, що кожен об’єкт працює в певний момент, але зменшуєте кількість разів, коли він споживає процесор.
  • фізика також може бути знижена (можна використовувати лише коробки зіткнення та сфери, коли роумінг та подалі від зору).
  • спрощення AI / моделювання шляхом виділення дуже елементарної поведінки для NPC та навколишнього середовища, поки гравці далеко. Зазвичай це буде роумінг або сканування ворогів замість полювання, збору, ведення господарства ...
  • деякі фізики та AI також можуть бути делеговані клієнтам. Якщо у вас дійсно не вистачає процесора на серверах, ви можете відзначити об'єкт як частково вирішений, і клієнти будуть коригувати фізику та положення цих об'єктів локально (щоб уникнути плаваючих NPC). Клієнтам може бути надана певна відповідальність за виконання AI (під час бою проти гравця пристрій цільового гравця може безпосередньо керувати атакуючими NPC)
  • для гравців фізика також може бути знижена на сервері, і клієнти отримають більшу відповідальність при вирішенні колізій. Наприклад: якщо ви потрапили в об'єкт своїм транспортним засобом, сервер вирішить зіткнення лише на коробках зіткнення та відзначить об'єкти як потенційно зіткненнями. Клієнт відправить дозвіл на сервер із позначкою часу, яка прийме його, якщо об’єкти позначені тегами та рішення здається правильним.

Після впровадження цих механізмів ви можете вирішити, скільки і як часто вони вам потрібні. Чудова річ у тому, що пізніше ви можете додати кілька серверів, які зможуть взяти на себе деякі завдання замість клієнтських додатків.

Звичайно, приблизне виявлення зіткнення створить деякі відхилення, але ви зможете їх вирішити, додаючи час від часу більш точну.

Що стосується фізики, ви повинні ознайомитись з libs, які підтримують таку систему GPGPU, як OpenCL або CUDA, якщо у вас є доступ до сервера, який підтримує будь-який.


Комбінування розділення простору регіону з пріоритетними оновленнями має бути саме тим, що мені потрібно, оптимальним для невеликої кількості гравців і все ж оптимізованим при завантаженні багатьох областей. Дякую.
Грімшо

@DevilWithin Це повинно допомогти, і воно не потребує змін на стороні клієнта. Я також додав ще кілька деталей у відповідь.
Койот

Спрощений AI - чудова ідея. Хоча NPC далеко не гравці, їм не потрібно нічого робити, крім руху в більшості випадків. Це означає, що я можу зробити приблизно приблизно те, що вони роблять, кожні 1 хвилини чи щось, аби змусити їх блукати по всьому світу.
Грімшо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.