Фізика неправильно синхронізується по мережі під час використання Bullet


11

Я намагаюся впровадити систему фізики клієнт / сервер за допомогою Bullet, однак у мене виникають проблеми з синхронізацією.

Я реалізував спеціальний стан руху, який читає і записує перетворення з моїх ігрових об'єктів, і він працює локально, але я спробував два різних підходи для мережевих ігор:

  1. Динамічні об'єкти клієнта, які також є на сервері (наприклад, не випадкові сміття та інші незначні речі), стають кінематичними. Це працює правильно, але об’єкти рухаються не дуже плавно
  2. Об'єкти динамічні для обох, але після кожного повідомлення від сервера про те, що об’єкт перемістився, я встановлюю лінійну та кутову швидкість до значень із сервера і викликаю btRigidBody :: procedToTransform з перетворенням на сервері. Я також закликаю btCollisionObject :: activate (true); змусити об’єкт оновити.

Моя мета 2 методу полягала в тому, щоб в основному зробити метод 1, але викрадення кулі робити передбачення бідолахи, а не робити власне, щоб згладити метод 1, але це, здається, не працює (з причин, які не на 100% зрозумілі для я навіть переступаю через кулю) і об’єкти іноді опиняються в різних місцях.

Я рухаюся в правильному напрямку? Здається, у кулі вбудований власний інтерполяційний код. Чи може це допомогти мені зробити так, щоб метод 1 працював краще? Або мій код 2 методу не працює, тому що я випадково тупою цим?

EDIT: Ще одна проблема з методом 1, яку я щойно помітив, полягає в тому, що реакція на зіткнення буде можливою для зіткнень з несинхронізованими об'єктами. Кінетичні тіла начебто стріляють речі до нескінченності іноді, оскільки їх неможливо відбити назад.


Кілька речей, які можуть допомогти вам отримати відповідь: Яку мову / двигун ви використовуєте? Який тип з'єднання? Наскільки поганий дефіцит синхронізації порівняно з пінг-сервером?
Fibericon

2
Другий варіант не працює, тому що ви швидкості до серверних значень встановлюєте лише через кілька кадрів, тому між кожним пакетом є кілька кадрів, де все може переміщатися. Я рекомендую прочитати всі публікації Гаффера з фізики ігор, ви, мабуть, спершу прочитайте "Виправити свій часовий крок", але ось остання стаття, яка розповідає про мережеву фізику gafferongames.com/game-physics/networked-physics
Рой Т.

Я використовую саморозвинений двигун на C ++. Однак я впевнений, що дефіцит синхронізації не такий вже й поганий, мабуть, 1 кадр над пінгом, якщо я повинен був здогадуватися, але я все ще роблю тестування в основному лише через LAN. Я перевірю ці статті, і так, ти маєш рацію, що швидкість вимкнена. Однак речі шлях геть, як щик по карті. Чи не слід чітко встановити перетворення, щоб зрештою річ взагалі відповідала? (навіть якщо це ще не дуже, джигги та ін.)
Лукас

Я читав пост Гаффера, і це було інформативно, але, здавалося, я маю справу з рухом гравця, над чим я вже працюю. Я читав, і здається, що мій код 2 методу практично ідентичний методу, який використовується в двигуні Unreal . Вони не надають багато деталей, але це змушує мене замислитись, чи ідея є здоровою, але моє використання Bullet просто неправильне.
Лукас

Цікаво читати, що частково пов'язано з вашою темою: gamasutra.com/view/feature/3094 / ... . Йдеться про rts, а не про фізику, але вони доходять до того, де їм доведеться синхронізувати моделювання на сервері та клієнтах. Як вони це роблять? Вони виконують незалежні імітації як на клієнті, так і на сервері, але сервер надсилає пакунки, які переконуються, що імітація клієнта не розходиться і виправляється, якщо це трапиться ...
tom van green

Відповіді:


4

Вам потрібне правильне прогнозування на стороні клієнта .

Ви дійсно повинні детально прочитати посилання, яке Рой Т. надав у своєму коментарі . У ньому описано, що робити з фізикою введення та символів гравця, але принцип залишається тим самим для "фізики, керованої сервером".

Це не тривіально для реалізації, але кількома словами, для ігрових об'єктів, які потрібно синхронізувати:

  • Виконувати фізику як на сервері, так і на клієнті;
  • Сервер регулярно надсилає оновлення;
  • Клієнт постійно і плавно переорієнтовує свій фізичний світ до серверних значень.

Так, так, ви рухаєтесь у правильному напрямку зі своїм методом 2. Хоча просто переосмислення значень недостатньо, ви отримаєте стрибки на клієнті, що вам потрібно зробити, це плавно та постійно інтерполювати значення сервера.

Що стосується вашої фактичної помилки, я не знайомий з Bullet, але ви, мабуть, пропускаєте деякі значення, наприклад, ви встановили лінійні та кутові швидкості, але чи встановили ви прискорення?


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

3

Особисто я займаюся тим, хто проводить гру, створює світ фізики та синхронізує об’єкти з клієнтами. Навіть якщо його мережева схема p2p, я все-таки будую двигун фізики на одному з клієнтів-гравців.

Інша фізика, яку я використовую - це суто цукерки для очей, навіть не потребує синхронізації.

У прототипі я зробив деякий час назад під назвою "kotlzerker", я керував фізикою на хості, а ефекти частинок (також використовуючи фізику) не синхронізувались по мережі, але незалежні для кожного клієнта, оскільки вони були цукерками для очей.


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

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

2

Неможливо реалізувати мережеві синхронні світи фізики. Мала різниця в кроці N курсу, набагато більша різниця на етапі N + 1. Ви не можете застосувати сили чи імпульси, щоб синхронізувати та виглядати реалістично.

Рішення: -

  1. Ви можете розглянути можливість синхронізації лише кількох об'єктів, таких як символи чи гоночні машини, особливо якщо вони є кінематичними. Але більша частина світу не була б синхронною, щоб виглядати реалістично.

  2. Ви можете мати один світ фізики на сервері та транслювати положення та швидкості об’єктів для клієнтів.


Ви можете спробувати пограти в якусь мережеву гру з фізикою, щоб побачити, що світи не синхронізовані. наприклад, Need For Speed ​​World є безкоштовним, має багатокористувацьку і основну фізику. (ящики на дорозі та руйнуючі предмети)
Макс

Я не впевнений, що точно за тобою слідкую. Я впевнений, що це можливо, оскільки багато ігор дозволяють гравцям кидати ящики навколо (наприклад). Схоже, ваш варіант 2 схожий з моїм варіантом 2, але я не можу змусити «Пулю» чітко прив’язати об’єкти до їх серверних позицій. Можливо, це моя корінна проблема?
Лукас

1
Ні. Зазвичай це ілюзія синхронності. Якщо ви порівнюєте екрани, то ви побачите, що коли ви підстрибуєте у коробках, коробки летять у різних напрямках. або ящики - це зовсім не фізика (лише редакція анімації). Кількість коробок різна. Коли я кажу, що анімація, я маю на увазі, що поза рухами немає фізичної анімації. Вони не виконують різноманітних хитрощів, щоб малюнок виглядав дещо синхронізованим, але це не синхронний світ фізики. Вам слід подивитися і порівняти, як вони рухаються в різних іграх.
Макс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.