Основные сетевые команды
Вступление
Несмотря на растущую популярность создания собственных конфигов и настроек для Half-Life, многие игроки имеют лишь приблизительное представление о реальном значении некоторых команд, отвечающих за сетевые настройки.
Целью данной статьи является детальное разъяснение эффекта основных сетевых команд как для Half-Life 1.5 таки для грядущего 1.6 релиза.
"Удушье"
Эффект "удушья" (лаг со стороны клиента) возникает в случае, если пропускная способность соединения не справляется с объемом поступающего трафика. Сейчас мы попробуем разобраться почему это происходит.
Время посылки слудеющего пакеты вычисляется так:
Текущее время + 1/cl_updaterate
Текущее время + (Количество посланных байтов/значение rate)
Соответственно, если у вас выставленно высокое значение cl_updaterate, а пропускная способность соединения недостаточна вы начнете испытывать лаг. Также, большое количество игроков означает увеличение потока данных, а значит увеличение задержек из-за низкой пропускной способности. Тот же эффект наблюдается при низком значении rate. При возникновении эффекта "удушья" сервер пытается справиться с ним посылая пакеты подряд, не дожидаясь следующего времени посылки, установленного в 1/cl_updaterate, пока лаг не будет устранен.
Интерполяция
Движок Half-Life использует интерполяцию для хранения истории игровых позиций и времени, когда игрок точно находился в этих позициях. После этого используется ex_correct для поиска в истории двух лучших позиций (заметьте, абсолютно не обязательно двух последних). Соответственно игрок всегда двигается с постоянной скоростью (реальная скорость передвижения игрока между позициями на сервере) меж этих двух позиций, не знависимо от значения ex_interp (до тех пор пока ex_interp выставлен равным 1/cl_updaterate или выше).
Единственный случай, когда игрок реально может двигаться быстрее, это после огромной потери пакетов или после сильной задержки из-за высокого пинга так, как он отстает от игрового мира и скорость увеличивается, чтобы исправить его реальную позицию.
Команды
cl_updaterate/cl_cmdrate:
Причина относительно низких значений по умолчанию состоит в том, что игра разработана для поддержки игроков с любыми типами соединений и обеспечения им нормальной игры через интернет. Еще одна причина - HLDS должен работать практически на любом компьютере и не создавать сильной нагрузки на процессор.
Команды cl_updaterate и cl_cmdrate контролируют трафик сервер-клиент и клиент-сервер. Чем выше значения, тем чаще посылаются пакеты, а значит, тем больше трафик. Однако, выставление низких значений не приведет к искажению реальной картины (это происходит только при большой потере пакетов), так как движку Half-Life не требуется полное соответствие работы клиента и сервера.
А вот выставление слишком высоких значений cl_updaterate и cl_cmdrates ведет к ряду неприятных последствий:
Как сказано выше, если соединение не успевает обработать весь трафик, возникает лаг. Сервер испытывает значительно большую нагрузку, т.к. происходит более частая посылка значительно меньших изменений, подсчет которых вызывает сильную нагрузку на процессор и приводит к лагу со стороны сервера.
Выбор значений индивидуален для каждого и должен основываться на типе и качестве соединения. Высокие значения годятся только для локальных сетей, но не для Интернета
ex_interp
Команда, вокруг которой всегда ходит множество слухов, опасений и мифов. В Half-Life 1.5 лучшим значением ex_interp является установленное по умолчанию - 0.1. Дело в том, что существует небольшой баг (и на сервере и на клиенте), влияющий на то, как interp раскладывается на клиенте и пересылается на сервер (и, соответственно, как он потом включается в лагокомпенсацию на сервере). В результате различных жутких мифов многие думают что 0.1 - единственное допустимое значение, что сослужило хорошую службу в минимизации эффекта бага. ex_interp равное 0.1 - не закон, просто с ним все работает нормально . Не меняйте без особых на то причин, в противном случае можете возникнуть резкое снижение точности стрельбы примерно на половину хитбокса или более.
Как многие из вас вероятно уже знают, сетевой код Half-Life притерпит ряд изменений в версии 1.6. Алгоритм вычисления лагокомпенсации для клиента и сервера будет модифицировн.В частности ex_interp можно (и нужно) будет выставлять в 1/cl_updaterate (0.01 при cl_updaterate равном 100). Новая формула равно 1/cl_updaterate потому, что при условии отсутствия эффекта "удушья" и потери пакетов игроки и объекты будут двигаться непрерывно и получать следующее обновление от сервера сразу по завершении интерполяции. Заметим, что для получения полного эффекта от ex_interp равного 0.01 сервер должен быть способен посылать 100 пакетов в секунду каждому клиенту, а подавляющее большинство серверов этого просто не могут.
sv_lan
После того, как CPL (и другие чемпионаты) изменили значения cl_updaterate и cl_cmdrate со стандартных на более высокие можно заметить возросшие лаги в LAN соревнованиях. Это происходит потому, что HLDS выставляет rate в 10000 на всех клиентах при sv_lan равному 1. Изначально, это было сделано не для ограничения значения rate 10000, а для поднятия значения по умолчнию на клиенте с 2500 до 10000 и достижения более комфортной игры в локальной сети. В новой версии Half-Life это будет исправлено. Однако движок Half-Life ограничивает максимальное значение rate 20000, или все что выше игнорируется.
ex_extrapmax 1.2
Экстраполяция происходит в случаях, когда у клиента нет конечной позиции для интерполяции. В этом случае экстраполируется предсказанная позиция на которую и передвигается клиент. Extrapmax устанавливает максимальное время экстраполяции для игрока (насколько далеко мы будем предсказывать позицию). Если позиция выходит за пределы выставленного значения игрок прекращает движение. Сервер всегда учитывает только значение по умолчанию, так что изменение этого значения ничего не даст.
ex_correct 0
Еще один способ интерполяции и предсказания для клиента. Сервер всегда осовывается на значении 0. Эта команда будет удалена из следующей версии Half-Life.
ex_maxerrordistance 64
В сочетании с ex_correct равным 1 вы можете выставить максимальный радиус, в котором игрок будет плавно двигаться от позиции x к позиции y. Если игрок покидает этот радиус он будет мгновенно телепортирован в конечную позицию. Но так, как сервер учитывает только ex_correct равным 0 толку от этого не много. Эта команда также исчезнет в следующей версии Half-Life.
sys_ticrate
Эта команда ограничивает максимальную скорость посылки пакетов клиентам. Чем выше значение, тем больше пакетов может быть послано.
sv_maxupdaterate
Ограничивает частоту обновлений сервера. Чем выше значение, тем больше пакетов будет послано клиентам (если скорость посылки позволяет).
Заключение
Как сказано ранее, наиболее важными факторами для выбора значений являются личные предпочтения и какую нагрузку могут выдержать ваше соединение и компьютер. Движок Half-Life дает возможность нормально взаимодействовать даже при низких значениях. В хорошем окружении (читай: в локальной сети) и клиент и сервер могут выдержать даже большие значения игра будет еще более комфортной.