суббота, 1 сентября 2012 г.

Настройка рейтов Counter-Strike Source

В этой статье будут рассмотрены все консольные команды касающиеся настройки рейтов Counter-strike Source (CSS) с их подробным описанием.

клиент - сервер

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

 

tickrate, cl_updaterate, cl_cmdrate, rate (рейты)

В процессе игры все происходящее нам кажется непрерывным, но на самом деле это не так. Сервер Counter-Strike Source способен обрабатывать события игрового мира с частотой шестьдесят шесть раз за одну секунду (tickrate 66). Это значение установлено по умолчанию и встроенных возможностей для его изменений не предусмотрено. Исходя из этого, понятно, что клиент не может отправлять и получать данные чаще, чем установленный tickrate.

По умолчанию клиент получает от сервера двадцать пакетов в секунду, каждое изменение в игре вы сможете наблюдать не раньше, чем придет очередной пакет, а значит с частотой двадцать раз за одну секунду. Очевидно, что этого не достаточно, особенно если учесть высокую динамику игры. Вы только представьте себе ситуацию, когда ваш противник стрейфует или резко выбегает из за угла. В таких игровых моментах нужна повышенная информативность от сервера. Частоту обновления данных можно изменить с помощью консольной переменной cl_updaterate. Как упоминалось ранее, скорость приема пакетов ограничена значением tickrate сервера. Значит, максимально возможное значение cl_updaterate составит шестьдесят шесть пакетов в секунду.

cl_updaterate 66
(Установив это значение рейтов, вы будете получать более точные и более информативные данные о происходящем в игре.)

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

cl_cmdrate 66
(С таким параметром рейтов сервер будет максимально быстро получать сведения о ваших действиях.)

Все игроки Counter-strike Source обладают разным подключением к сети интернет. Во избежание потери пакетов подход к настройке клиента должен быть индивидуален для каждого. При помощи консольной переменной rate можно установить максимальное значение данных, которые вы можете принимать, т.е. установить максимальный входящий трафик вашего подключения. В этом случае сервер будет знать о вашей входящей пропускной способности и никогда не пошлет обновлений больше чем установленный rate. По умолчанию значение rate составляет 30000 байт в секунду. Рассчитать правильный rate очень просто, достаточно перевести ваш входящий трафик в байты. Например, мое подключение к интернету 15 Мбит/с (15*2 20 / 8 = 1966080 байт). Ставить такое высокое значение лишено всякого смысла. Поэтому лично я ограничиваюсь rate 262144 (2 Мбит/с)

Почему разработчиками Valve изначально установлены такие низкие значения rate, cl_updaterate и cl_cmdrate. Скорее всего, это исходило из расчета на среднестатистического пользователя с медленным модемным соединением. Но по моему нескромному мнению это могло иметь место еще несколько лет назад, когда ни кто не имел представление что такое доступ в мегабит(ы). В соревновательных режимах применяются максимально возможные рейты.


 

интерполяция и lerp

Теперь поговорим об интерполяции, что это и с чем его едят. Выше уже шла речь о том, что клиент получает от сервера информацию в виде пакетов (по умолчанию 20 пакетов в секунду). От сюда следует, что все изменения, происходящие на игровом сервере мы не сможем увидеть чаще, чем будем принимать пакеты. Можно было бы спросить, почему же картинка выглядит такой плавной, ведь это все равно, что смотреть фильм с малой кадровой частотой. Как раз за это и отвечает функция интерполяции. Принцип ее работы очень прост. На основе информации, которую несут в себе входящие пакеты, клиент пытается рассчитать промежуточные значения между ними. Тем самым, клиент заполняет недостающие кадры «фальшивыми».
Рейты - Интерполяция.
( Зеленым обозначены входящие пакеты, красным - кадры рассчитанные на их основе. Эта картинка демонстрирует работу интерполяции, в реальности пакеты приходят значительно чаще)

Как нетрудно догадаться, чем больше клиент будет получать пакетов от сервера, тем меньше интерполяция будет отдавать нам «фальшивых» снимков. Значит при максимально возможном обновлении (cl_updaterate 66), игрок будет получать более точную и честную информацию.

Для настройки интерполяции в клиенте предусмотрено несколько консольных переменных: cl_interp_ratio, cl_interp. Переменная cl_interp_ratio задает число интервалов, через которые будет происходить интерполяция (по умолчанию 2 интервала). Клиент будет ждать до тех пор, пока не придут два пакета, и только потом будут рассчитываться  промежуточные значения. В случае потери одного из пакетов расчет будет вестись на основе второго. Установка cl_interp_ratio 1 (один интервал) заставит клиент ждать только один пакет, что сведет задержку интерполяции (lerp) к минимуму.

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

Переменная cl_interp устанавливает величину интерполяции. Рассчитать cl_interp очень просто:

cl_interp=cl_interp_ratio / cl_updaterate
(можно установить cl_interp 0, тогда его значение будет рассчитано автоматически.)

лагокомпенсация

Лагокомпенсация на сервере сводит к минимуму влияние задержек (пинга) клиент-сервер, а также задержек интерполяции. Представьте себе, что вы играете на сервере, который географически находится далеко от вас и вдобавок у всех игроков разные задержки. Вы делате точный выстрел в бегущего противника. За время прошедшее от нажатия вами на клавишу мыши и доставкой пакета на сервер ваша цель уже давно скрылась за угол, но попадание все равно засчитывается. Это происходит благодаря лагокомпенсации на стороне сервера. Все дело в том, что сервер запоминает позиции всех игроков, делая снимки игрового мира, и при обработке вашего выстрела находит нужный снимок по формуле:

засчитанный выстрел = текущее время сервера - ваш пинг - lerp

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

предсказание (prediction)

Допустим, что вы подключились к серверу с очень большим пингом, например 200 мс. Любое ваше действие, будь то движение или стрельба, отправляются на сервер в виде пакетов, далее сервер фиксирует эту информацию и отправляет ее вам и всем остальным игрокам. В итоге вы сможете наблюдать свои же действия с задержкой равной пингу. Чтобы испытать это на своей шкуре,  создайте игру и введите в консоль sv_cheats 1, net_fakelag 200, cl_predict 0 (cl_predict 0 - отключает предсказание на стороне клиента). Передвигаться, а уж тем более стрелять становится просто невозможно. Для исправления сего, предусмотрена функция предсказания. Клиент пытается сам предугадать события на сервере, относительно ваших действий, не дожидаясь их от него. Это дает игроку чувство комфорта в игре. Но, по причине того, что в момент отправки пакета клиент еще не знает обо всех изменениях происшедших на сервере, могут возникнуть ошибки предсказания, которые порождают скачки изображения. Для того чтобы их сгладить в клиенте предусмотрена консольная переменная cl_smooth (по умолчанию включено) и переменная cl_smoothtime, которой можно настроить время сглаживания.

Надеюсь эта статья помогла вам разобраться с вопросами, касающимися настройки рейтов в Counter-Strike: Source.

Комментариев нет:

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