Синхронизируйте физику с игровым сервером

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

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

Отправка позиций/скорости:

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

Отправка нажатий клавиш

  • Я могу кормить физику сервера точно так же, как на клиенте (по нажатию клавиш). Это означает меньше кода!
  • Интерполяция не нужна.

Итак, что может быть плохого в моей идее? Почему это (афаик) не используется в играх?


person Johannes    schedule 01.09.2012    source источник


Ответы (2)


Он не используется по двум основным причинам: одна указана пользователем 1640050, а другая гораздо более существенна:

Расчет задержки - вам все равно нужно будет рассчитать ее как на стороне клиента, так и на стороне сервера, поскольку в Интернете задержка между сервером и клиентами будет составлять 20-500 мс. Что обычно происходит, так это то, что обе стороны вычисляют физику, и действия (на самом деле не нажатия клавиш) отправляются по сети с отметкой времени со временем клиента. Затем сервер выполняет вычисления снова, вычисляет все взаимодействия между клиентами и отправляет корректировки траекторий обратно клиенту.

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

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

person qdot    schedule 01.09.2012
comment
Кроме того, клиенты обычно не отправляют скорости и позиции — слишком легко их обмануть. Они отправляют действия, обе стороны вычисляют, что означают эти действия. - person qdot; 01.09.2012
comment
Когда вы говорите, что они посылают действия вместо скоростей и позиций, как будут выглядеть такие действия? - person Johannes; 02.09.2012
comment
Отметка времени: 234567893123, идентификатор корабля 234, дроссель двигателя 100% Отметка времени: 234567893129, идентификатор корабля 234, дроссель двигателя 20% Отметка времени: 234567893133, идентификатор корабля 234, дроссель двигателя 0% - person qdot; 02.09.2012
comment
Проверьте кодовую базу xpilot (www.xpilot.org), она дает хорошее представление о том, что может происходить. - person qdot; 02.09.2012

Я почти уверен, что вычисление физики на сервере было бы слишком тяжелым для сервера. Особенно с большим количеством людей. Хотя это может ускорить работу клиента, сервер станет узким местом.

person user1640050    schedule 01.09.2012
comment
Встречный вопрос: если я могу смоделировать 32 корабля на клиенте (например, для ИИ), почему сервер не может этого сделать? - person Johannes; 01.09.2012
comment
Это потому, что сервер обычно обрабатывает более одной игры одновременно, по крайней мере, при любом практическом использовании. - person qdot; 01.09.2012