Как работает Server-Client
Home / Новости / Как работает Server-Client
img
Новости New World
30 октября 2021

Как работает Server-Client

Разработчики вышли на форумы, чтобы уточнить комментарии по работе клиент-сервера. Полное заявление можно увидеть ниже
Luxendra
Всем привет,

В New World недавно произошла ошибка, которая вызвала некоторые предположения о том, как работает наша симуляция. Ошибка была исправлена ​​быстро, но и предположение, и ошибка заслуживают некоторой ясности в объяснении.
New World не является авторитетным клиентом - с точки зрения симуляции New World полностью основан на сервере. На высоком уровне модель такова: клиенты отправляют входные данные контроллера на сервер, а затем сервер проверяет эти входные данные на предмет ограничений, которые могут сделать их недействительными, а затем, если они приняты, использует их в качестве входных данных для персонажа («actor» - это наше внутреннее имя ) в памяти сервера. Затем выполняются правила физики и игры (полностью на стороне сервера), а результат отправляется обратно исходному клиенту. Затем клиент игры будут рендерить результат, отправленный сервером.

Возьмем, к примеру, игрока, размахивающего топором, чтобы рубить дерево. Игрок нажимают кнопку, и топор раскачивается, что может показаться очень ориентированным на клиента. То, что происходит на самом деле, намного сложнее. Игрок нажимает кнопку, на сервер отправляется сообщение, в котором говорится: «Я нажал кнопку для взмаха», и в то же время клиент начинает рисовать визуальное изображение размахивания топора на дисплее игрока - эта часть строго графическая и не имеет никакого отношения к моделированию. Сервер даже не знает об этом графическом представлении и не слышит никакой информации, кроме самого нажатия кнопки.

Когда входные данные достигают сервера, он проверяет, возможно ли это, а затем сервер начинает анимацию полностью серверной версии «скелета» для персонажа с замахом. Это не аппроксимация или версия ограничивающего объема скелета, она на самом деле полностью детализирована, полностью анимирована, поэтому мы можем иметь такую ​​точность, что если топор едва задевает дерево, это согласуется между сервером и тем, что клиент воспринимает как возможное. Если результатом этой полностью серверной анимации является пересечение топором дерева, то этот результат отправляется обратно клиенту или возвращается ошибка. Важно отметить, что только после того, как сервер выполнил анимацию и в результате топор пересек дерево, это считается успешным. Мы не сокращаем и не вычисляем это грубо, мы полностью детализируем физику для всех таких действий. Получив результат, будь то попадание или промах, клиент настроит свое визуальное отображение в соответствии с тем, что определил сервер. Здесь мы используем несколько уловок на стороне клиента, чтобы «растянуть» анимацию, пока клиент ожидает ответа сервера, но результат всегда основан только на ответе сервера. Тот же самый образец применяется в бою и других взаимодействиях симуляции физики.

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

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