» Новости
» Регистрация :: Вход
» Форумы сайта :: IRC-чат
» Файловый архив
» Все статьи :: Все обзоры
» Галерея
» Поиск
 
Клиент-сервер в HL и CS, Newbie e-mail автора
Вопросы задержки
.: Просмотров: 2551 :: Печатать текущую страницу :: Печатать все страницы :.
Предыдущая страница Все страницы: Следующая страница

" Перевод: Newbie

" Оригинал статьи

Вопросы задержки

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

Основная проблема такова: Сервер получает от всех клиентов информацию о том что ониделают. Далее сервер непрерывно обновляет состояние мира Counter-Strike на основе этойинформации и сообщает всем клиентам о текущем состоянии.

Теперь предположим что игрок нажал кнопку идти вперед. Через 250ms сервер получает этуинформацию. До этого момента этого движения не существует, потому что сервер о нем незнал.

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

Еще 250ms спустя все клиенты получают эту информацию и наконец-то видят изменения наэкране.

Все отлично, кроме того факта, что игрок был на этой позиции пол секунды назад! То чтокаждый игрок видит на экране - это позиция игрока примерно пол секунды назад.

Есть еще одна особенность, которую необходимо понимать. Есть разница между тем, чтоделает игрок (в данном случае 500ms назад) и тем, что знает о нем сервер (250ms назад).

Когда игрок прицеливается и стреляет значение имеет только позиция, о которой знаетсервер, а не позиция, о которой знает клиент, ведь информация об этом еще не дошла досервера.

Так что, когда игрок целится и стреляет, он целится в позицию противника, которую тотзанимал 500ms назад с точки зрения этого противника, но только 250 ms назад с точкизрения сервера.

Естественно, что если бы все было именно так, нормальное прицеливание было бы оченьзатруднено.

Решение этой проблемы достаточно просто. Сервер сохраняет историю передвижений игроковза последние полсекунды или около того. Когда информация о выстреле достигает сервера,сервер знает сколько она к нему шла (допустим 241ms для данного конкретного выстрела) итакже знает среднюю задержку цели (предположим 70ms). В результате сервер смотрит историюпозиций по сумме этих двух значений (311ms) и проверяет была ли в момент выстрела цельточно в перекрестии прицела.

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

Таким образом игроки могут прицеливаться нормально, не вычисляя позиций.

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

Клиент может сам выбирать, желает ли он использовать историю позиций на сервере (то естьжелает ли он целиться прямо в цель или предсказывать ее позицию самостоятельно).

Делается это с помощью команды cl_lc. Установленная в 1, она приказывает клиентуиспользовать историю, при значении 0 - не использовать.

Ниже четко показана разница:

cl_lc 1 cl_lc 0

На левом видео показан клиент, использующий историю. Пистолет выстрелил когда цельпересекла прицел. Некоторое время спустя данные достигли сервера, который проверилисторию, вычислил попадание. Далее об этом от сервера узнал клиент цели и модельдернулась от попадания.

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

Предыдущая страница Все страницы: Следующая страница
Реклама

 
Наша-Life
Свяжитесь с нами
Экспорт новостей в RSS 2.0