Настройка рейтов для CS 1.6 [Re]HLDS

Рейты под старые и новые билды и ReHLDS

Автор статьи: gudaus

Рейты - общее название для параметров, определяющих частоту и объём обмена информации сервера с клиентом.

Вначале пройдёмся по терминологии.

  1. sv_maxrate и sv_minrate - максимальное / минимальное количество байт за одну секунду времени которые сервер посылает клиенту, включая потери пакетов (loss).
  2. sv_minupdaterate и sv_maxupdaterate - минимальная / максимальная частота отсылки обновлений от сервера к клиенту. Влияет на фпс. Если сервер отошлёт клиенту, к примеру, 40 обновлений за 1 секунду, у клиента фпс будет 40 либо ниже.
  3. loss - количество потерянных пакетов из последних 100. Пакеты могут теряться из-за перегрузки канала либо плохой связи между сервером и клиентом. Проблема в 90% случаев неустранимая.
  4. choke - количество пакетов, отправка которых была задержана сервером, чтобы не превысить лимит полосы, устанавливаемый sv_minrate, sv_maxrate. Также зависит от sv_minupdaterate и sv_maxupdaterate. Причина - сервер генерирует либо слишком много трафика. Это проблему можно решить настройками.

Как настраивать рейты?

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

  • sv_maxrate 20 000 на билдах 5***. sv_maxrate 50 000-100 000 на билде 6***. На билдах 5*** выше, чем 20 000 устанавливать было нельзя. Вы можете прописать любое число в конфиге, хоть миллион, но реально максимум будет 20 000. На билдах 6*** появилась возможность повысить до 100 000, но если канал связи не очень хороший, то имеет смысл поискать оптимальное значение в диапазоне 50 000 - 100 000.
  • sv_minrate 50 000 - 100 000 на билдах 5***. sv_minrate 25 000 на билдах 6***. Да, на билдах 5*** нельзя было выставить sv_maxrate больше, чем 20 000, но это обходилось условием sv_minrate. Никакой магии, дело в принципе отбора рейтов HLDS. Работает это так:

Под rate имеется в виду клиентский rate. То есть что происходит? В начале HLDS смотрит на maxrate. Если клиентский выше, то понижаем до серверного, если ниже - оставляем как есть. Затем HLDS смотрит на minrate. Если клиентский выше серверного, то оставляем всё как есть, а если клиентский ниже серверного, то приравниваем клиентский к серверному. Вот и получалось на билдах , что клиентский rate всегда ниже, чем серверный(100 000), и принудительно выставлялось значение 100 000. На билдах максимальное значение sv_maxrate повысили до 100 000, и эта хитрость стала бессмысленной.

if rate>sv_maxrate then rate=sv_maxrate;
if rate
if rate>sv_minrate then rate=rate;
if rate

  • sv_minupdaterate 20-30. 20 - значение по умолчанию, 30 - разумный минимум для человеческого глаза.
  • sv_maxupdaterate 60 - 101 для билдов 5*** и sv_maxupdaterate 60 - 102 для билдов 6***

Теперь можно начать выставлять значения.

Заходим в server.cfg, сперва выставляем всё по максимуму.

Для билдов 5*** это

sv_maxrate 20000
sv_minrate 100000
sv_minupdaterate 30
sv_maxupdaterate 101

Для билдов 6*** это

sv_maxrate 100000
sv_minrate 25000
sv_minupdaterate 30
sv_maxupdaterate 102

Далее анализируем поведение сервера. Заходим в игру, включаем в консоли график нагрузки (net_graph 0/1/2/3), играем и параллельно смотрим на выданные в нём значения.

  1. Если сервер фризит, то понизьте sv_minrate на билде 5*** / sv_maxrate на билде 6***. Понизьте sv_minupdaterate до 20.
  2. Если у клиента choke, то имеет смысл повышать sv_minrate. По сути на билде 5*** вы должны жёстко задать rate клиенту путём sv_minrate>sv_maxrate, а на билде 6*** можно поэкспериментировать с sv_maxrate 100 000 sv_minrate [20 000; 100 000]. Значения выше 100 000 ставить крайне не рекомендуется. Также можно понизить значение sv_maxupdaterate. Зачем слать обновления клиенту, если они всё равно не доходят? Но лучше всего будет, если вы сумеете убрать choke и фризы, не уменьшая sv_maxupdaterate.
  3. Если избавились от фризов и choke, то можно попробовать потихоньку снижать рейты, дабы лишний раз не нагружать канал. Понизьте sv_minupdaterate до 20, к примеру. Потихоньку снижайте sv_minrate.

Вопросы и ответы

Я видел, что на билдах 6*** ставят sv_minrate 100 000, sv_maxrate 25 000, как на старых. А в статье сказано ставить наоборот. Где правда?

Ответ: никакой путаницы нет. Вспомним правило расчёта рейтов

if
rate>sv_maxrate then rate=sv_maxrate;
if
rate
if
rate>sv_minrate then rate=rate;
if
rate

Оно одинаково для всех билдов.

В случае с sv_minrate 100 000, sv_maxrate 25 000 клиентский rate жёстко задаётся в 100 000. На старых билдах делали именно так, потому что не было возможности превысить ограничение в 20 000 иначе.

В случае с sv_minrate 20 000, sv_maxrate 100 000 клиентский rate колеблется между значениями 20 000 и 100 000. На стиме и клиентах нового билда это оптимально, на клиентах старого билда (с бустов) rate клиента станет скорее всего 25 000, так как именно такое значение чаще всего прописывают владельцы бустов. Его можно увеличивать, повышая sv_minrate.

Поясню на примерах

В случае с билдом 6***
sv_minrate 100 000, sv_maxrate 25 000 => rate 100 000
sv_minrate 70 000, sv_maxrate 40 000 => rate 70 000
sv_minrate 30 000, sv_maxrate 100 000 => rate между 30 000 и 100 000 на стимах, 30 000 на бустах.
sv_minrate 10 000, sv_maxrate 50 000 => rate между 10 000 и 50 000 на стимах, 25 000 на бустах.

Откуда 25 000? Это значение чаще всего выставляют владельцы бустов в клиенте.

В случае с билдом 5***
sv_minrate 100 000, sv_maxrate 25 000 => rate 100 000
sv_minrate 70 000, sv_maxrate 40 000 => rate 70 000
sv_minrate 30 000,sv_maxrate 100 000 => rate 30 000
sv_minrate 10 000, sv_maxrate 50 000 => rate между 10 000 и 20 000, скорее всего 20 000.

Откуда 20 000? Владельцы бустов в клиенте обычно ставят 25 000, но сервер с билдом 5*** поддерживает только sv_maxrate <=20 000

Что такое фриз и как понять, есть ли он?

Ответ: Фриз - остановка игры. От английского Freeze. Представляет собой кратковременную остановку. Игровой мир замирает, после чего игра продолжается.

Обычно бывают 2 ситуации - или небольших фризов много, каждый - доли секунды, или фризов мало, на каждый - по 1-2 секунды. На графике net_graph 1/2 выглядит как резкое подскакивание фиолетовой полоски вверх.