Что такое TickRate, причем тут Tick и откуда берется Rate?

Всем доброго времени суток! В этой очередной и долгожданной статье, я хотел бы затронуть такую тему, как tickrate, ведь это основа основ и понимать базовые принципы следует не только скриптерам, но и держателям серверов. Для любознательных администраторов - это отличный статья для того, чтобы открыть капот и посмотреть, что же там творится на самом деле, почему 128 тикрейт популярней 64 и стоит ли переплачивать деньги.

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

Небольшой дисклеймер: Это не перевод официальной документации, а исключительно мое узкое размышление.

Навигация:
1. Начнем с истоков, что такое Rate?
2. Почему некоторые консольные команды начинаются с sv_, а некоторые с cl_?
3. Пинг, откуда он взялся и какое его назначение?
4. Интерполяция и экстраполяция?

1. Начнем с истоков, что такое Rate?

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

Подмечу, что в такой чудесной игре как CS:GO есть настройка рейта вшитая в пользовательский интерфейс игры, именуется она, как "Ограничение пропускной способности".

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

Если окунуться в это еще подробней, то rate, который частенько игроки прописывают в консоле (rate 196608), число 196608 - это число Bps aka Б/с (Байт в секунду), если произвести нехитрые вычисления, а в одном мегабите 125000 байт, то мы получим, что rate 196608
- это ничто иное, как 1.57 Mbps aka Мбит/с (Мегабит в секунду). На рисунке 1 вы можете лицезреть настройку рейта в CSGO, через общие настройки игры, да я знаю, что в других играх этого нет (возможно), но как общие сведения о том, что число, которые вы указываете в консоле - это число байт, в некоторых играх это число переводится в мегабиты.

Ограничение пропускной способности.jpg

Рис.1. Настройка пропускной способности в CSGO.

А вот на рисунке 2, который располагается ниже, вы можете посмотреть на определение пропускной способности простым языком от Valve.

Ограничение пропускной способности определение от Valve.jpg.png

Рис.2. Определение rate от Valve.
Разработчики констатируют тот факт, что недостаток пропускной способности, может привести к задержке доставки информации от сервера к клиенту, то бишь вам. Давайте попробуем подобрать отличную пропускную способность для вас и еще чуть-чуть углубиться в эту тему.
Совершенно не секретно, что в интернете гуляет такая вот табличка сопоставления числа байт и мегабит для рейта, продублирую ее здесь:
0.5 Mbps – rate 62500 (Минимальный)
1.0 Mbps – rate 125000
1.5
Mbps – rate 187500
1.57
Mbps – rate 196608 (Стандартный)
2.0 Mbps – rate 250000
2.5
Mbps – rate 312500
3.0
Mbps – rate 375000
3.5
Mbps – rate 437500
4.0
Mbps – rate 500000
4.5
Mbps – rate 562500
5.0
Mbps – rate 625000
5.5
Mbps – rate 687500
6.0
Mbps – rate 750000
6.2
Mbps – rate 786432 (Максимальный)
В данной таблице отчетливо видно сопоставление числа мегабит с число байт для выставления рейтов, но давайте попробует определить подходящее число для вас.
Я на своем примере попробую определить свою максимальную пропускную способность и за основу возьму официальные сервера вольв по CSGO. Обычно их физическое расположение это Стокгольм и Люксембург для стран СНГ, вы же можете проверять на серверах расположенных в Москве, Санкт-Петербурге и т.п., если большую часть проводите на серверах сообщества, а не официального матчмейкинга, для других игр алгоритм будет аналогичен. И так приступим:

1. Заходим на вот этот сайт или любой другой.
2. Выбираем страну и город (в моем случае я проверяю на Швеция, Стокгольм).
3. И смотрим на такие критерии, как Download и Upload.
4. Выставляем число не выше полученного значения, то бишь в моем случае - Download 11.53 Mbps, а Upload 19.21 Mbps (не смейтесь только), поэтому я могу смело выставить rate 786432, что соответственно равно 6.2 Mbps.

Отлично, теперь мы знаем, что такое пропускная способность (rate), знаем, как ее настроить, но о каких подводных камнях еще предстоит узнать?
Например, еще есть такой квар для сервера, как sv_minrate - это минимальный пропускной порог, для сервера и если на сервере он больше вашего, то сервер автоматически изменит вашу пропускную способность на свою минимальную допустимую пропускную способность, учтите, что это изменение работает в рамках сервера.

Давайте подведем черту под темой с рейтами, обобщим ее и пойдем дальше, итак мы имеем:

* rate xxx = Ограничению пропускной способности = Максимально допустимой пропускной способности = Максимальное число байт, которое может передать сервер вам (клиенту) *

2. Почему некоторые консольные команды начинаются с sv_, а некоторые с cl_?

Обычно этому не уделяют должного внимания, но ведь практически каждая команда имеет определенное отношение к тому или иному аспекту игры. Например, cl_radar_scale - регулирует масштаб вашего радара, все верно, вашего и никого другого, а команда sv_cheats - дает разрешение на использование чит-команд на сервере, и в рамках конкретного сервера эти команды будут доступны или недоступны. Вы будете совершенно правы, если еще в начале моих рассуждений поэтому поводу ответили, что sv_ - сокращение от слова server, а cl_ - client. Да, я уже упоминал эту терминологию в виде клиента и сервера, да и в принципе поверхностно вы уже это более менее должны понимать, но лишним вспомнить не помешает.

Почему, я так акцентирую на этом ваше внимание? Все до безумия просто, все игры многопользовательские игры на движке Source Engine используют сетевую архитектуру Клиент-Сервер (рисунок 3). То есть отныне, если вы слышите про это впервые, ваше мировоззрение о таких играх, как CSGO, CSS, Dota 2, Team Fortress и т.д. кардинально поменяется. Но к этому вы еще вернемся в будущем, просто пока достаточно знать, что есть некоторое деление на клиентскую часть и серверную, а самое главное на самом деле клиент ничего не знает о другом клиенте из-за особенности этой архитектуру.
К чему я задел эту обширную тему, да еще и мельком? Потому что любые команды можно поделить на два типа:

1. Серверные - осуществляются на стороне сервера и работают исключительно на нем, они не могут нанести ущерб пользователю и сломать ему его персональную настройку.
2. Клиентские - осуществляются на стороне клиента/пользователя и работают исключительно на нем, они априори не могут нанести ущерб серверу, обычно ими являются персональные настройки пользователя, и обычно они вынесены в пользовательский интерфейс, но большая часть скрыта.


Архитектура клиент-сервер.png

Рис.3. Архитектура Клиент-Сервер.

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

3. Пинг, откуда он взялся и какое его назначение?

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

Ping (пинг) - это некий промежуток времени, за который пакет данных, отосланный с вашего компьютер доходит до сервера и возвращается обратно, рисунок 4. Единицы в которых изменяется пинг - это ms (миллисекунды), а значит, если условно на сервере вы имеет пинг = 50, то при помощи не больших преобразований мы переводим миллисекунды в секунды и получаем 0.05 секунд, согласитесь, такую задержку тяжело разглядеть.
Пинг.jpg

Рис.4. Пинг.

Давайте вспомним, многопользовательские игры на Source Engine - это Клиент-Серверные приложения, клиент с сервером взаимодействуют путем обмена (пересылкой) небольших пакетов данных, время их пути от клиента к серверу и обратно измеряется в пинге, а число отправленных пакетов принято измерять в единицах в секунду. Клиент отправляет серверу нажатие клавиш (под нажатием клавиш подразумеваю команды +forward и т.п.), выстрелы, сообщения и т.д., что в совокупности это просто набор, если грубо говоря консольных команд. Сервер в свою очередь отправляет клиенту расположение других игроков, сущностей, воспроизводит эффекты звука, анимации и тем самым мы получаем модель, в которой клиент ничего не знает о другом клиенте и всю информацию получает от сервера. Естественно задержка в интернете не даст получать вовремя нужные пакеты с данными и это вызывает так называемые лаги, и мы визуально начинаем это чувствовать, игрок подвисает, телепортируется и прочее.

Но, какой лайфхак использует Valve в своих играх, чтобы компенсировать эти лаги? Смотрим ниже.

4. Интерполяция и экстраполяция?




Вот тут есть дамп всех консольных команд для CSGO, а вот здесь есть руководство по тому, как сделать его собственноручно.

Ссылки на второстепенную литературу для более подробного изучения материала (для любознательных):