Так как это шутер, то было бы неплохо обсчитывать физику сервером, но это ММО, и из за предположительно огромного количества людей, будет очень высокая нагрузка, на обсчитывание физики. Если же обсчитывать физику клиентами, то нагрузки на серверное железо будет не велико, но нагрузка на ПК игрока немного возрастет. Физика клиента обсчитывает только себя, и дальше уже эти данные через сервер передаются остальным, вроде удобно. Но тут всплывает вопрос защиты от читов, что тоже сложно.
Клиенту так и так надо уметь самостоятельно обрабатывать физику всех объектов, просто потому что данные от сервера будут приходить с непредсказуемой периодичностью. Поэтому на клиенте должна быть реализована вся физика да еще и с предикшеном.
Второе. Всю физику сервер не потянет. Поэтому на сервере должно проверятся только самое критичное: попадания прожектайлов, свободное падение, коллизии со статическими объектами и ландшафтом, разумное ограничение на скорость перемещения обжей в пространстве. Причем что касается коллизий: их обсчет стоит делать с меньшей точностью чем на клиенте.
Т.е. принцип такой что вся тяжесть расчетов ложится на клиенты, а сервер лишь проверяет самое критичное, что бы не позволить читерить.
Такие вопросы стоит задавать на профильных ресурсах, ДТФ таким к сожалению не является, хотя и очень хочет.
Ну и вообще, странно такие вопросы получать. Для разработки проекта уровня ммо шутера с открытым миром надо обладать огромным опытом, причем желательно не домашним, а реальным коммерческим, что бы понимать как всё это работает и как все устроено в таких проектах. Тогда таких вопросов не будет.
Приходилось писать сервера, но для сессионных игр, там физику делали на стороне клиента. ММОРПГ сервер для меня впервые, вот и такой вопрос всплыл. А так уже ~2 наработал в одной команде, где и писал сервера. Вопрос задал так как не уверен немного, вдруг кто знает реализации в ВОВ или подобных игр. Конечно у меня есть деньги на мощьное железо для сервера, но все же узнать мнение других, не помешало.
Зависит от того, что понимать под физикой.
Всякую шушеру вроде перемещабельного по карте мусора, обладающего своей физической моделью (если таковой имеется в игре, речь о вещах типа всяких мячиков в овервотче, которые вроде с физ. моделью, но на геймплей никак не влияют), лучше отдать на откуп хавоку или другим физ. движкам, и обсчитывать на стороне клиента. Разрушаемость, если таковая присутствует, тоже пускай обсчитывается клиентом, машины у игроков сейчас сильные, а вот лишние флопсы сервера, особенно для первого проекта без бюджета, будут на вес золота.
А вот состояния игрока (в прыжке ли, падает ли, где сейчас находится, куда и как движется) и всю стрельбу лучше обсчитывать гибридно. Типа, клиент всё равно будет постоянно транслировать данные об этом серверу, чтобы сервер передал это другим игрокам. Так что нужно просто сделать проверку входящих данных на их валидность, чтобы игрок не мог заморозить хп, или накрутить себе скорость бега и высоту прыжка каким-нибудь чит энджином. В случае стрельбы же всё зависит от её механики. C хитскан-пушками (даже если нанесение урона после выстрела производится с задержкой дабы сымитировать время полёта пули) можно тупо проверять, была ли цель в прицеле у игрока, когда он стрелял, этого хватит (вместо более сложных проверок лучше потратить время и силы на разработку мониторящего геймплей античита, или заюзать существующие типа BattlEye). А вот если у тебя в игре есть сложная баллистическая модель, то её придётся считать сервером, иначе пингующие игроки окажутся на дне, а это херовая идея, ибо в необъятных просторах нашей страны мнение игроков с плохим пингом лучше учитывать.
Ну, давайте подумаем.
Если это шутер, значит будет много рейкастов для обсчета попаданий. Считать все это на сервере очень затратно, но полностью отдать это на откуп клиенту — значит расплодить читеров.
Я вижу два подхода:
- считать попадания на клиенте, при этом на сервере вести статистику попаданий и, если кто-то будет сильно выбиваться из нее, то это читер. Иными словами, тут нужно немного дата сайенс отсыпать.
- считать попадания на клиенте, при этом слать на сервер баллистику (тип оружия, углы, скорость и т.п.), чтобы иметь возможность раз в какой-то период времени (т.е., не каждый выстрел) валидировать.
Про валидацию тут тоже есть варианты. Можно валидировать каким-нибудь отдельным от основного сервера сервисом для обсчета физики, можно валидировать другими клиентами (шлешь N клиентам исходные данные, истина — по большинству голосов).
Теперь про общую физику коллизий. Тут нужно с заданной периодичностью слать на сервер данные по скоростям и пр. игроков и валидировать их, но не на каждый кадр, а так, чтобы было возможно отбросить условного читера на нужную позицию без драматических скачков для других.
Вероятно, можно и еще придумать варианты, но такими пользовался лично я (опыт разработки игровых серверов около 3х лет).
Читера легко вычислить по среднему времени между появлением цели на в зоне видимости и ее поражением. Всякие wall hack и aim помощники их нехило так сокращают.
Приэтом видимость можно сразу у обоих игроков сразу. За истину брать время у подстреленного игрока. Ибо ему читеть скорее всего нет смысла
Стрельба будет аркадной, без сложной баллистики. Поэтому мы все же будет делать примерно что то тип того. Будет храниться статистика игрока за некоторое время(Статистика в плане все события с игроком и временные метки этих событий), и уже можно будет смотреть аномальные значения. Физику вынесу на клиент, и будет збс думаю.