Как происходит работа сервер/клиент.

Недавно в New World произошла ошибка, которая вызвала некоторые догадки о том, как работает наша модель. Ошибка была быстро устранена, но и домыслы, и ошибка заслуживают некоторой ясности в объяснении.

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

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

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

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

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

Источник https://forums.newworld.com/t/notice-how-serverclient-authority-is-handled-in-new-world/473167

Оставьте ваш комментарий