ПрограммированиеФорумСеть

Синхронизация физических объектов

#0
22:32, 4 авг 2023

Всем привет. В прошлой теме я затрагивал вопрос синхронизации машин по сети. И очень много людей откликнулось, благодарю за полезные советы и идеи. А как насчет синхронизации физических объектов? На скриншоте ниже показано, что у меня запущено две версии игры с 0 пингом. Но бочки у хоста и клиента разбросаны по-разному после столкновения. Это возможно как-то исправить на уровне движка? Не хотелось бы перегружать сеть излишними вычислениями. Для справки: физика сделана на основе PhysX.

Screenshot | Синхронизация физических объектов
#1
2:16, 5 авг 2023

FlashRoyal
> Не хотелось бы перегружать сеть излишними вычислениями.

Сеть ничего не вычисляет. А вычислять должен сервер.

#2
8:22, 5 авг 2023

Вряд ли что выйдет из-за ошибок во float, из-за недостатка точности.

#3
10:06, 5 авг 2023

MikeNew
Т.е предпочтительней использовать double для значений xyz, верно?

#4
10:12, 5 авг 2023

И ещё вопрос как лучше передавать данные? Цельным вектором или отдельно x, отдельно y и отдельно z. Так мне кажется будет чаще обновляться информация и меньше потерь будет.

#5
10:43, 5 авг 2023

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

#6
11:44, 5 авг 2023

Ну с бочками более-менее понятно. А как быть с разрушаемыми объектами? Если у одного клиента объект сломался на 5 кусков, а у второго на 7. Как быть в такой ситуации?

#7
12:19, 5 авг 2023

FlashRoyal
> Ну с бочками более-менее понятно. А как быть с разрушаемыми объектами? Если у
> одного клиента объект сломался на 5 кусков, а у второго на 7. Как быть в такой
> ситуации?
Ломай одинаково. Если там генератор случайных чисел используется, синхронизируй генераторы, это возможно.

#8
16:21, 5 авг 2023

В PhysX вроде как нет детерминизима. Поэтому на разных клиентах будет по-разному и нужно принудительно синхронизировать. По разному в том числе из-за FPS и прочего. Поэтому в UE4 с этим проблемы, а для UE5 написали свой физический движок Chaos. Вот в движке Bullet в отличии от PhysX детерменизм есть. Но это все не точно. Сам изучаю тему.

#9
16:22, 5 авг 2023

FlashRoyal
Скорее всего нужно физику считать для одного игрока, а другому пересылать матрицы объектов (точнее достаточно будет  position  и rotation , к тому же при желании можно их упаковать потеряв немного в точности, что не критично), но из-за пинга скорее всего для второго игрока будет слайдшоу. А вот синхронизироваться, что бы на разных устройствах идентично посчиталась физика мне кажется маловероятным, даже если точно синхронизировать позиции машин, направления и скорость, так как из-за разной скорости просчета, может быть разное поведение алгоритмов в самом ядре физики, например могут меньше или больше браться сэмплов, разная быть погрешность, рандомные вектора для сэмплирования. Если у кого-то получалось реализовать такую синхронизацию, отпишитесь, интересно было бы узнать.

#10
16:34, 5 авг 2023

камон, у тебя на карте 6-10 движущихся объектов (машин). Сложно что ли где то матрицу держать? Пусть сервер считает и выдает координаты. Да, это не элегантное решение одним модулем, но это надежное решение которое точно сработает. Пока у тебя нету 20 000 объектов, то и нагрузка на сеть будет лишь незначительная, особенно когда единственное что отдает это вектор xyzFm направление и усилие, остальное достоверно может посчитать уже встроенный физ движок. На выходе импульсы детекстятся на уровне сервера, к ним одинаково для всех игроков даются начальные импульсы, а дальше уже на пеках пользователя одинаково для всех считается траектория, вторичные столкновения и так далее.

#11
16:49, 5 авг 2023

PhysX может быть детерминированным, если вы будете использовать фиксированные временные интервалы и включите режим “enhanced determinism”, который означает, что контакты разрешаются в неслучайном порядке.

ПрограммированиеФорумСеть

Тема в архиве.