MultiPlayer - Связь с сервером, что передавать - PullRequest
1 голос
/ 09 июля 2020

Как подсказывает название, в настоящее время я пытаюсь создать небольшую многопользовательскую игру в качестве проекта, просто чтобы узнать больше обо всех необходимых навыках.

Все это jappens в Java: Я не уверен, как обращаться с сервером. В настоящее время мои мировые объекты сохраняются как ArrayList, содержащий самописный класс «Entity». Он отображается путем закрашивания каждого изображения от объекта до кадра в соответствии с его координатами. Все это прекрасно работает. Здесь возникает вопрос:

С каждым изменением мира, например движением любого объекта, должен ли я передавать весь ArrayList объектов каждому игроку, если я просто отправлю изменения, а затем обновлю только измененный объект, или следует сохранить мир на сервере вместо локальной машины и отправить ввод, который вызывает изменение, например, WASD для движения игрока?

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

Заранее спасибо

1 Ответ

1 голос
/ 09 июля 2020

В многопользовательской игре скорость - приоритет номер 1. Все, что так или иначе увеличивает накладные расходы, замедляет, требует загрузки или постоянно передает большие фрагменты данных, следует избегать любой ценой. должен оставаться на клиенте. Теперь клиент может загрузить мир и внедрить туда все, создать хороший gui и все это. Это не приведет к подключению к сети. Однако сервер должен знать четверть каждого трехмерного объекта (при условии, что вы используете трехмерный объект), поэтому fe:

PLAYER_A:
posX: 3,
posY: 3,
posZ: 4,
rotX: 30 °,
rotY: 60 °,
rotZ: 10 °

Чтобы избежать отправки 6 сообщений на сервер (который затем транслирует их другим игрокам ), мы изобрели четвертины (шестимерные объекты). Но я сомневаюсь, что java может использовать это из коробки, поэтому вы должны сами придумать решение. Вам также следует подумать о таких вещах, как «скорость вперед» и «скорость прыжка», так как это легче вычислить на машине клиента.

Теперь возьмите объект, как вы его называете, и отправьте его в server.

Теперь сервер знает, что «игрок a находится в xyz, смотрит на ab c».
Затем сервер передает это другим игрокам, которые, надеюсь, получат информацию вовремя (поэтому всегда старайтесь используя UDP и игнорируя потерю пакетов данных) и будет вычислять и анимировать это на своей стороне.

Если задержка достаточно мала (например, 20 мс), игроки будут испытывать это в «реальном времени» (хотя есть не в реальном времени)

Tl; dr: Всегда старайтесь отправлять как можно меньше на сервер, и пусть сервер будет транслировать это клиентам. Затем они могут «пересчитать» анимацию самостоятельно.

РЕДАКТИРОВАТЬ: Конечно, вам понадобится подпрограмма update (), которая периодически отправляет на сервер информацию об объектах мира, например, расположение деревьев et c. Хотя клиент может удалить эти сущности, когда они находятся вне поля зрения (и я ДЕЙСТВИТЕЛЬНО рекомендую вам это сделать), серверу все еще необходимо знать полный макет карты (то есть без текстур и прочего, это скоро станет действительно большим)

...