Nekro
Терра инкогнита
- Сообщения
- 4,023
- Реакции
- 2,260
- Операционная система
- Linux


Борьба рейтов сервера и клиента в CSS: Кто в приоритете?
Введение
Вопрос о том, как рейты клиента влияют на сервер и наоборот, актуален для многих администраторов серверов Counter-Strike: Source и игроков. Правильные настройки рейтов обеспечивают плавный и честный игровой процесс. Но что произойдет, если настройки сервера и клиента не совпадают? Кто в итоге "побеждает" в этой борьбе? Давайте разберёмся.
Что такое рейты и зачем они нужны?
- Рейты сервера — это сетевые параметры, которые определяют, как часто сервер обновляет информацию и обменивается данными с клиентами.
- Рейты клиента — это параметры на стороне игрока, которые управляют частотой отправки и получения данных между клиентом и сервером.
- rate — пропускная способность для передачи данных.
- cmdrate — частота отправки команд клиентом на сервер.
- updaterate — частота получения обновлений от сервера клиентом.
- cl_interp и cl_interp_ratio — параметры интерполяции, влияющие на отображение движений других игроков.
Как сервер управляет рейтами клиентов?
Серверные настройки определяют минимальные и максимальные значения, которые могут использовать клиенты. Вот примеры серверных параметров:sv_minrate "128000"
sv_maxrate "128000"
sv_mincmdrate "100"
sv_maxcmdrate "100"
sv_minupdaterate "100"
sv_maxupdaterate "100"
sv_client_max_interp_ratio "2"
sv_client_min_interp_ratio "2"
Что это значит для клиента?
- Если клиент установит rate ниже, чем sv_minrate, сервер заставит его использовать минимум, установленный сервером.
- Если клиент выставит cmdrate или updaterate выше, чем sv_maxcmdrate или sv_maxupdaterate, сервер ограничит их этими значениями.
- Интерполяция клиента будет ограничена настройками сервера sv_client_min_interp_ratio и sv_client_max_interp_ratio.
Оптимальные клиентские настройки
Для сервера с тикрейтом 100 и рейтами 128000 игрокам рекомендуется использовать следующие настройки:rate "128000"
cl_cmdrate "100"
cl_updaterate "100"
cl_interp "0"
cl_interp_ratio "2"
net_graph "3"
Эти параметры обеспечивают:
- Стабильный обмен данными с сервером.
- Минимальную задержку между действиями игрока и их отображением на сервере.
- Честные условия для всех игроков благодаря фиксированной интерполяции.
Могут ли клиентские рейты влиять на сервер?
Клиентские рейты не могут напрямую влиять на производительность сервера. Однако:- Плохие настройки клиента могут привести к лагам, задержкам и телепортации самого игрока.
- Если клиент использует нестабильные настройки (например, низкий cl_updaterate), это ухудшит его восприятие игры, но сервер продолжит работать стабильно.
- Сервер всегда принудительно применяет свои ограничения, не позволяя клиентам использовать неподходящие рейты.
Вывод
- Серверные рейты в приоритете: они задают допустимые диапазоны для клиентов и обеспечивают стабильность игры.
- Оптимальные клиентские настройки позволяют игрокам получать наилучший опыт в рамках ограничений сервера.
- Фиксированная интерполяция (например, cl_interp_ratio 2) помогает поддерживать честный и предсказуемый игровой процесс для всех.




Примеры рейтов:
sv_minrate "128000" // Минимальный рейт для игроков (128 КБ/с).
sv_maxrate "128000" // Максимальный рейт для игроков (128 КБ/с).
sv_mincmdrate "100" // Минимальная частота команд от клиента (100 команд/с).
sv_maxcmdrate "100" // Максимальная частота команд от клиента (100 команд/с).
sv_minupdaterate "100" // Минимальная частота обновлений от сервера (100 обновлений/с).
sv_maxupdaterate "100" // Максимальная частота обновлений от сервера (100 обновлений/с).
sv_client_cmdrate_difference "1" // Разница между cmdrate и updaterate не более 1.
sv_client_max_interp_ratio "2" // Максимальный коэффициент интерполяции (2).
sv_client_min_interp_ratio "2" // Минимальный коэффициент интерполяции (2).
sv_competitive_minspec "1" // Принудительное использование конкурентных настроек.
cl_interp "0" // Автоматический расчёт интерполяции.
cl_interp_ratio "2" // Коэффициент интерполяции (2).
sv_maxrate "128000" // Максимальный рейт для игроков (128 КБ/с).
sv_mincmdrate "100" // Минимальная частота команд от клиента (100 команд/с).
sv_maxcmdrate "100" // Максимальная частота команд от клиента (100 команд/с).
sv_minupdaterate "100" // Минимальная частота обновлений от сервера (100 обновлений/с).
sv_maxupdaterate "100" // Максимальная частота обновлений от сервера (100 обновлений/с).
sv_client_cmdrate_difference "1" // Разница между cmdrate и updaterate не более 1.
sv_client_max_interp_ratio "2" // Максимальный коэффициент интерполяции (2).
sv_client_min_interp_ratio "2" // Минимальный коэффициент интерполяции (2).
sv_competitive_minspec "1" // Принудительное использование конкурентных настроек.
cl_interp "0" // Автоматический расчёт интерполяции.
cl_interp_ratio "2" // Коэффициент интерполяции (2).
//
Настройки пропускной способности
sv_minrate "128000" // Минимальная пропускная способность для игроков (128 КБ/с).
// Это значение предотвращает использование низкого рейта, что уменьшает лаги.
sv_maxrate "128000" // Максимальная пропускная способность для игроков (128 КБ/с).
// Современные клиенты и серверы способны работать на этом уровне.
//
Настройки частоты команд от клиента
sv_mincmdrate "100" // Минимальная частота команд, отправляемых клиентом (100 команд/с).
// Соответствует 100 тикрейту, обеспечивая точность отправки действий.
sv_maxcmdrate "100" // Максимальная частота команд от клиента (100 команд/с).
// Устанавливает верхний предел для cmdrate, соответствующий 100 тикрейту.
//
Настройки частоты обновлений от сервера
sv_minupdaterate "100" // Минимальная частота обновлений, отправляемых сервером клиенту (100 обновлений/с).
// Это значение поддерживает плавность игры при 100 тикрейте.
sv_maxupdaterate "100" // Максимальная частота обновлений от сервера клиенту (100 обновлений/с).
// Ограничивает максимальный updaterate для всех клиентов.
//
Балансировка cmdrate и updaterate
sv_client_cmdrate_difference "1" // Разрешает разницу между cmdrate и updaterate не более 1.
// Гарантирует синхронизацию между отправкой команд и получением обновлений.
//
Настройки интерполяции
sv_client_max_interp_ratio "2" // Максимальное значение интерполяции для всех клиентов.
// Интерполяция = 2 / updaterate (для 100 тикрейта это 0.02 секунды).
sv_client_min_interp_ratio "2" // Минимальное значение интерполяции для всех клиентов.
// Фиксирует интерполяцию на уровне 2 для стабильности игры.
cl_interp "0" // Автоматический расчёт минимально возможной интерполяции.
// Позволяет игре подстроиться к оптимальному значению.
cl_interp_ratio "2" // Коэффициент интерполяции (2), что даёт 0.02 секунды при 100 updaterate.
//
Конкурентные ограничения
sv_competitive_minspec "1" // Обязывает игроков использовать минимальные конкурентные настройки.
// Предотвращает использование конфигураций с пониженной графикой для нечестного преимущества.

sv_minrate "128000" // Минимальная пропускная способность для игроков (128 КБ/с).
// Это значение предотвращает использование низкого рейта, что уменьшает лаги.
sv_maxrate "128000" // Максимальная пропускная способность для игроков (128 КБ/с).
// Современные клиенты и серверы способны работать на этом уровне.
//

sv_mincmdrate "100" // Минимальная частота команд, отправляемых клиентом (100 команд/с).
// Соответствует 100 тикрейту, обеспечивая точность отправки действий.
sv_maxcmdrate "100" // Максимальная частота команд от клиента (100 команд/с).
// Устанавливает верхний предел для cmdrate, соответствующий 100 тикрейту.
//

sv_minupdaterate "100" // Минимальная частота обновлений, отправляемых сервером клиенту (100 обновлений/с).
// Это значение поддерживает плавность игры при 100 тикрейте.
sv_maxupdaterate "100" // Максимальная частота обновлений от сервера клиенту (100 обновлений/с).
// Ограничивает максимальный updaterate для всех клиентов.
//

sv_client_cmdrate_difference "1" // Разрешает разницу между cmdrate и updaterate не более 1.
// Гарантирует синхронизацию между отправкой команд и получением обновлений.
//

sv_client_max_interp_ratio "2" // Максимальное значение интерполяции для всех клиентов.
// Интерполяция = 2 / updaterate (для 100 тикрейта это 0.02 секунды).
sv_client_min_interp_ratio "2" // Минимальное значение интерполяции для всех клиентов.
// Фиксирует интерполяцию на уровне 2 для стабильности игры.
cl_interp "0" // Автоматический расчёт минимально возможной интерполяции.
// Позволяет игре подстроиться к оптимальному значению.
cl_interp_ratio "2" // Коэффициент интерполяции (2), что даёт 0.02 секунды при 100 updaterate.
//

sv_competitive_minspec "1" // Обязывает игроков использовать минимальные конкурентные настройки.
// Предотвращает использование конфигураций с пониженной графикой для нечестного преимущества.
Клиентские настройки:
rate "128000"cl_cmdrate "100"
cl_updaterate "100"
cl_interp "0"
cl_interp_ratio "2"
net_graph "3"
Как клиентские настройки влияют на сервер?
Клиентские настройки влияют на игровой процесс, но в пределах ограничений, установленных сервером. Вот основные моменты:
- rate:
- Клиент может установить любое значение для rate, но сервер ограничивает его значениями sv_minrate и sv_maxrate.
- Например, если сервер имеет sv_minrate "128000", клиент с более низким rate будет принудительно использовать минимум 128000.
- cl_cmdrate и cl_updaterate:
- Эти параметры управляют частотой обмена данными между клиентом и сервером.
- Если клиент укажет cl_cmdrate или cl_updaterate выше, чем sv_maxcmdrate или sv_maxupdaterate на сервере, они будут автоматически ограничены сервером.
- Если клиент установит их ниже серверного minrate, это может вызвать задержки и ухудшить его собственный опыт игры, но на сервере это не вызовет проблем.
- Интерполяция (cl_interp и cl_interp_ratio):
- Интерполяция влияет на отображение движения других игроков на клиенте.
- Серверные настройки sv_client_min_interp_ratio и sv_client_max_interp_ratio ограничивают интерполяцию клиента.
- Например, если сервер требует интерполяцию 2, клиент не сможет использовать другое значение.
- net_graph:
- Эта команда отображает сетевую информацию только для клиента и не влияет на сервер.
Вывод:
- Серверные настройки в приоритете: Они устанавливают пределы для рейт, частоты обновлений и интерполяции.
- Клиентские настройки могут варьироваться в рамках этих ограничений и влияют только на опыт самого игрока, но не на работу сервера.
- Проблемы возникают только у самого игрока, если его настройки не соответствуют требованиям сервера (например, лаги, телепортации, задержка в управлении).
Таким образом, сервер обеспечит стабильность и честные условия игры, независимо от того, что выставит клиент (в пределах заданных серверных ограничений).
Буду рад вашим правкам/замечаниям
Что такое TickRate и с чем его «едят»?
Что такое TickRate, причем тут Tick и откуда берется Rate? Всем доброго времени суток! В этой очередной и долгожданной статье, я хотел бы затронуть такую тему, как tickrate, ведь это основа основ и понимать базовые принципы следует не только...
hlmod.net

Настройка рейтов Counter-Strike Source
Настройка рейтов Counter-Strike Source (CSS). Подробное описание всех консольных команд для настройки рейтов.
fragtome.blogspot.com
В этой статье будут рассмотрены все консольные команды касающиеся настройки рейтов Counter-strike Source (CSS) с их подробным описанием.
По умолчанию клиент получает от сервера двадцать пакетов в секунду, каждое изменение в игре вы сможете наблюдать не раньше, чем придет очередной пакет, а значит с частотой двадцать раз за одну секунду. Очевидно, что этого не достаточно, особенно если учесть высокую динамику игры. Вы только представьте себе ситуацию, когда ваш противник стрейфует или резко выбегает из за угла. В таких игровых моментах нужна повышенная информативность от сервера. Частоту обновления данных можно изменить с помощью консольной переменной 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. Скорее всего, это исходило из расчета на среднестатистического пользователя с медленным модемным соединением. Но по моему нескромному мнению это могло иметь место еще несколько лет назад, когда ни кто не имел представление что такое доступ в мегабит(ы). В соревновательных режимах применяются максимально возможные рейты.
( Зеленым обозначены входящие пакеты, красным - кадры рассчитанные на их основе. Эта картинка демонстрирует работу интерполяции, в реальности пакеты приходят значительно чаще)
Как нетрудно догадаться, чем больше клиент будет получать пакетов от сервера, тем меньше интерполяция будет отдавать нам «фальшивых» снимков. Значит при максимально возможном обновлении (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
Лагокомпенсация дает возможность игрокам с разными задержками играть практически на равных, но с ростом и нестабильностью пинга эффективность лагокомпенсации падает.
Надеюсь эта статья помогла вам разобраться с вопросами, касающимися настройки рейтов в Counter-Strike: Source.
клиент - сервер
Все игры на движке 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.
Что такое Lerp в CS:S или как избежать лагов в игре. - Полезные статьи и советы - CS:GO&CS:S
Интерполяция Интерполяция была придумана для того чтобы как раз не происходило никаких дёрганий (или "лагов") в процессе игры. Возникает вопрос - интерполяция - чо это за уг? Интерполяция — в математике способ нахождения промежуточных значений величины по имеющемуся дискретному набору известных...
8arena.ru
Интерполяция
Интерполяция была придумана для того чтобы как раз не происходило никаких дёрганий (или "лагов") в процессе игры.
Возникает вопрос - интерполяция - чо это за уг?
Интерполяция — в математике способ нахождения промежуточных значений величины по имеющемуся дискретному набору известных значений.
Ну грубо говоря, интерполяция вычисляет промежуточные местоположения моделек по двум прибывшим пакетам, тем самым делая движения моделек плавнее.
Но если ей нужны 2 пакета, то получается, что с первым пакетом обновление игрового мира не происходит(компьютер ждёт второго, чтобы вычислить промежуточные значения), а значит происходит задержка(лерпа).
Лерпа(lerp) - время, за которое происходит интерполяция.
Итак, общая задержка равна ping+lerp.
Клиент-сервер - сетевой код игры созданный на основе обмена пакетами между сервером и клиентом (игрой). В этих пакетах информация о текущем состоянии игрового мира (расположении объектов и т.д.)
cl_updaterate - число пакетов которые клиент получает от сервера каждую секунду.
Интерполяция - получение промежуточных значений какой-либо величины, путем усреднения крайних. Интерполяция служит для сглаживания картинки, т.к. пакетов приходящих от сервера зачастую не хватает для того чтобы картинка смотрелась плавно.
Настройки клиентской части по умолчанию: cl_updaterate 20; cl_interp_ratio 2; cl_interp 0.1.
Как это работает
cl_updaterate 20 означает, что клиент будет получать от сервера пакеты 20 раз в секунду, разница между пакетами - 50 мс. Чтобы предотвратить лагание от возможной потери пакета, интерполяция должна происходить в промежуток времени равный 2*50=100 мс. Чтобы обеспечить такую интерполяцию, необходимо задать параметр cl_interp 0.1. Множитель два означает, что мы хотим интерполировать две области между тремя пакетами пришедшими от сервера: "...". Если мы хотим итерполировать только одну область "._.", мы должны изменить соответствующий параметр. Этим параметром является переменная cl_interp_ratio. Она может принимать значения 2, 1, 0. Как не сложно догадаться, если эта переменная равна нулю, то интерполяция на клиенте будет отсутствовать. В общем случае формула для промежутка такова: lerp = cl_interp, но не может быть меньше cl_interp_ratio/cl_updaterate. Итак, тут мы приходим к самому определению:
lerp - промежуток времени в котором пакеты полученные клиентом будут интерполироваться.
По сути, значение lerp определяет пропорцию между пакетами, пришедшими от сервера, и пакетами, сгенерированными на клиенте. Чем меньше значение lerp, тем меньше пакетов будет "придумано" на клиентской стороне, тем точнее то, что вы видите, будет соответствовать тому, что происходит на сервере. Чем больше значение lerp, тем большую долю в вашей картинке будет играть интерполяция.
После теории перейдем к практике. С самого начала кажется, что в идеале lerp должен быть равен 0, ведь при таком значении lerp нет интерполяции и клиент видит то же, что видит сервер. Вы НЕ можете себе позволить lerp = 0 по двум причинам.
1) Ваш интернет канал оставляет желать лучшего.
Предположим, что вы счастливый обладатель модема или в вашем городе широкополосный интернет пока по карману только избранным или ваш сосед по общежитию по вечерам заливает на торрент пачку свежих немецких фильмов. Это значит, что вы можете себе позволить исключительно скромные сетевые настройки. Скорее всего те, что стоят по умолчанию, а быть может ваши дела еще хуже. При cl_updaterate 20, даже если все пакеты благополучно приходят от сервера к клиенту, вы видите 20 кадров в секунду (не имеет значения, какой у вас компьютер). Человеческий глаз воспринимает эту картинку как дерганую. Если же, не дай бог, потери (choke) есть, то играть вы просто не сможете, так как будете видеть слайдшоу.
2) Настройки серверов не позволяют клиентской части выставлять необходимые значения некоторых переменных.
Главная проблема тут безусловно cl_interp_ratio, на данный момент ни один европейский серверный конфиг не позволяет играть с этой переменной равной нулю. На данный момент я не знаю ни одного паблика с такими настройками. Только несколько КВ-серверов позволяют отключать интерполяцию. Сейчас добавление sv_client_min_interp_ratio 0 (эта команда отвечает за минимальное значение cl_inerp_ratio, которое может иметь клиент находясь на этом сервере) в евроконфиге скорее всего вопрос времени, и я полагаю, ждать осталось не долго. Но факт остается фактом: значение этой серверной переменной по умолчанию равно 1, а это значит, что клиент не может сделать lerp меньше, чем 10 мс.
Если вторая причина вопрос времени, то вот с первой причиной совладать способов не очень много.
Если у вас плохой коннект и постоянно теряются пакеты, то lerp=0 не для вас. Вам нужна интерполяция cl_interp_ratio 2.
Если же интернет не проблема, то тогда рецепт очень прост. Поднимайте рэйты: cl_cmdrate 66; cl_updaterate 66; rate 20000 - это ваш минимум. В идеале на 100 тиковом сервере у вас должно быть cl_cmdrate 100; cl_updaterate 100; rate 25000. Если сервер позволяет, ставьте cl_interp_ratio 0; cl_interp 0.
66, а тем более 100, кадров в секунду - вполне достаточно, чтобы комфортно воспринимать игру без интерполяции и лагов. Если же сервер не позволяет вам играть без интерполяции (пока что, это самый распространенный случай), рецепт очень прост:
Я играю с cl_updaterate 66, это значит что в 3 пункте я получу 0.0152, следовательно мне нужно написать cl_interp 0.0152. Это даст мне lerp = 15. Что уже довольно неплохо. Так как интерполяция таких временных промежутков не слишком сильно добавляет неточности вашим действиям.
Если вы пишите значение cl_interp меньшее, чем cl_interp_ratio/cl_updaterate, то на net_graph lerp будет отображаться оранжевым цветом. Если же lerp окрашен в желтый, то значит значение lerp больше промежутка времени между отсылаемыми пакетами на этом сервере. В обоих случаях lerp (а значит cl_interp) нужно увеличивать пока тот не станет белым. Если вы будете пытаться играть с НЕ БЕЛЫМ lerp, то вы обрекаете часть своих выстрелов застревать в промежутке клиент-сервер.
Вывод
Добивайтесь минимального значения lerp, оставляя его белым на каждом сервере, на котором играете. Это позволит вам снизить к минимуму все проблемы, связанные с вашим соединением с интернетом.
Напоследок замечу, что существует миф, будто бы lerp должен быть равен пингу. Пинг - время за которое пакет доходит от сервера к клиенту и он не имеет никакого отношения к интерполяции. Бесполезно пытаться найти связи в этих двух понятиях. При любом пинге сохраняйте lerp минимальным и белым.
Интерполяция была придумана для того чтобы как раз не происходило никаких дёрганий (или "лагов") в процессе игры.
Возникает вопрос - интерполяция - чо это за уг?
Интерполяция — в математике способ нахождения промежуточных значений величины по имеющемуся дискретному набору известных значений.
Ну грубо говоря, интерполяция вычисляет промежуточные местоположения моделек по двум прибывшим пакетам, тем самым делая движения моделек плавнее.
Но если ей нужны 2 пакета, то получается, что с первым пакетом обновление игрового мира не происходит(компьютер ждёт второго, чтобы вычислить промежуточные значения), а значит происходит задержка(лерпа).
Лерпа(lerp) - время, за которое происходит интерполяция.
Итак, общая задержка равна ping+lerp.
Клиент-сервер - сетевой код игры созданный на основе обмена пакетами между сервером и клиентом (игрой). В этих пакетах информация о текущем состоянии игрового мира (расположении объектов и т.д.)
cl_updaterate - число пакетов которые клиент получает от сервера каждую секунду.
Интерполяция - получение промежуточных значений какой-либо величины, путем усреднения крайних. Интерполяция служит для сглаживания картинки, т.к. пакетов приходящих от сервера зачастую не хватает для того чтобы картинка смотрелась плавно.
Настройки клиентской части по умолчанию: cl_updaterate 20; cl_interp_ratio 2; cl_interp 0.1.
Как это работает
cl_updaterate 20 означает, что клиент будет получать от сервера пакеты 20 раз в секунду, разница между пакетами - 50 мс. Чтобы предотвратить лагание от возможной потери пакета, интерполяция должна происходить в промежуток времени равный 2*50=100 мс. Чтобы обеспечить такую интерполяцию, необходимо задать параметр cl_interp 0.1. Множитель два означает, что мы хотим интерполировать две области между тремя пакетами пришедшими от сервера: "...". Если мы хотим итерполировать только одну область "._.", мы должны изменить соответствующий параметр. Этим параметром является переменная cl_interp_ratio. Она может принимать значения 2, 1, 0. Как не сложно догадаться, если эта переменная равна нулю, то интерполяция на клиенте будет отсутствовать. В общем случае формула для промежутка такова: lerp = cl_interp, но не может быть меньше cl_interp_ratio/cl_updaterate. Итак, тут мы приходим к самому определению:
lerp - промежуток времени в котором пакеты полученные клиентом будут интерполироваться.
По сути, значение lerp определяет пропорцию между пакетами, пришедшими от сервера, и пакетами, сгенерированными на клиенте. Чем меньше значение lerp, тем меньше пакетов будет "придумано" на клиентской стороне, тем точнее то, что вы видите, будет соответствовать тому, что происходит на сервере. Чем больше значение lerp, тем большую долю в вашей картинке будет играть интерполяция.
После теории перейдем к практике. С самого начала кажется, что в идеале lerp должен быть равен 0, ведь при таком значении lerp нет интерполяции и клиент видит то же, что видит сервер. Вы НЕ можете себе позволить lerp = 0 по двум причинам.
1) Ваш интернет канал оставляет желать лучшего.
Предположим, что вы счастливый обладатель модема или в вашем городе широкополосный интернет пока по карману только избранным или ваш сосед по общежитию по вечерам заливает на торрент пачку свежих немецких фильмов. Это значит, что вы можете себе позволить исключительно скромные сетевые настройки. Скорее всего те, что стоят по умолчанию, а быть может ваши дела еще хуже. При cl_updaterate 20, даже если все пакеты благополучно приходят от сервера к клиенту, вы видите 20 кадров в секунду (не имеет значения, какой у вас компьютер). Человеческий глаз воспринимает эту картинку как дерганую. Если же, не дай бог, потери (choke) есть, то играть вы просто не сможете, так как будете видеть слайдшоу.
2) Настройки серверов не позволяют клиентской части выставлять необходимые значения некоторых переменных.
Главная проблема тут безусловно cl_interp_ratio, на данный момент ни один европейский серверный конфиг не позволяет играть с этой переменной равной нулю. На данный момент я не знаю ни одного паблика с такими настройками. Только несколько КВ-серверов позволяют отключать интерполяцию. Сейчас добавление sv_client_min_interp_ratio 0 (эта команда отвечает за минимальное значение cl_inerp_ratio, которое может иметь клиент находясь на этом сервере) в евроконфиге скорее всего вопрос времени, и я полагаю, ждать осталось не долго. Но факт остается фактом: значение этой серверной переменной по умолчанию равно 1, а это значит, что клиент не может сделать lerp меньше, чем 10 мс.
Если вторая причина вопрос времени, то вот с первой причиной совладать способов не очень много.
Если у вас плохой коннект и постоянно теряются пакеты, то lerp=0 не для вас. Вам нужна интерполяция cl_interp_ratio 2.
Если же интернет не проблема, то тогда рецепт очень прост. Поднимайте рэйты: cl_cmdrate 66; cl_updaterate 66; rate 20000 - это ваш минимум. В идеале на 100 тиковом сервере у вас должно быть cl_cmdrate 100; cl_updaterate 100; rate 25000. Если сервер позволяет, ставьте cl_interp_ratio 0; cl_interp 0.
66, а тем более 100, кадров в секунду - вполне достаточно, чтобы комфортно воспринимать игру без интерполяции и лагов. Если же сервер не позволяет вам играть без интерполяции (пока что, это самый распространенный случай), рецепт очень прост:
- Напишите в консоли cl_updaterate и запомните значение этой переменной
- Напишите в консоли cl_interp_ratio 1
- Разделите 1 на значение cl_updaterate
- Напишите в консоли cl_interp и присвойте ему то что получили в пункте 3
Я играю с cl_updaterate 66, это значит что в 3 пункте я получу 0.0152, следовательно мне нужно написать cl_interp 0.0152. Это даст мне lerp = 15. Что уже довольно неплохо. Так как интерполяция таких временных промежутков не слишком сильно добавляет неточности вашим действиям.
Если вы пишите значение cl_interp меньшее, чем cl_interp_ratio/cl_updaterate, то на net_graph lerp будет отображаться оранжевым цветом. Если же lerp окрашен в желтый, то значит значение lerp больше промежутка времени между отсылаемыми пакетами на этом сервере. В обоих случаях lerp (а значит cl_interp) нужно увеличивать пока тот не станет белым. Если вы будете пытаться играть с НЕ БЕЛЫМ lerp, то вы обрекаете часть своих выстрелов застревать в промежутке клиент-сервер.
Вывод
Добивайтесь минимального значения lerp, оставляя его белым на каждом сервере, на котором играете. Это позволит вам снизить к минимуму все проблемы, связанные с вашим соединением с интернетом.
Напоследок замечу, что существует миф, будто бы lerp должен быть равен пингу. Пинг - время за которое пакет доходит от сервера к клиенту и он не имеет никакого отношения к интерполяции. Бесполезно пытаться найти связи в этих двух понятиях. При любом пинге сохраняйте lerp минимальным и белым.
Последнее редактирование: