www.cs-msd.lv Counter-Strike 1.6 WAR3F, CSDM, ProKreedz, GunGame TEAMPLAY. Новости, Форум, Загрузки, Мониторинг, Статистика, FAQ, MSD.
Топ форумчане
cs-msd cs-msd
- 53 Постов
KiRa- KiRa-
- 0 Постов
SjavaPro SjavaPro
- 0 Постов
Kinder Kinder
- 0 Постов
And1488 And1488
- 0 Постов
Посмотреть топик
 Print Thread
Лаги в игре
cs-msd
| Вступление
Итак, лагом в общем случае можно назвать все внутри-компьютерные явления, которые мешают нормальной игре. Примеры: "слайд-шоу", зависание картинки, зависание игровых объектов. Но соседа с перфоратором к лагам отнести нельзя, хотя играть он мешает

| Все причины лагов можно разделить на:
1) Проблемы на компьютере игрока - их в силах решить сам игрок;
2) Проблемы на канале связи между компьютером игрока и сервером;
3) Проблемы на сервере.

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

| Список определений
ХЛ, Half-Life - в статье используется как название движка (но не игры про Гордона Фримена!). Данные из статьи применимы ко всем модам, созданным на этом движке, в том числе и для Counter-Strike.
Клиент - это программа (Half-Life), запущенная на компьютере игрока, которая обменивается данными с сервером и рисует картинку игрового мира.
хлдс, HLDS, Half-Life Dedicated Server -это программа такая, собственно серверная часть для Half-Life.
Сервер - Компьютер, на котором запускается хлдс
Квар, он же CVar, он же Console Variable - переменная, использующаяся в Half-Lfe, изменяющая какие-либо параметры игры. Может быть изменена пользователем из консоли (отсюда и название). Квары используются как на клиенте, так и в хлдс. Квары, влияющие только на серверную часть, имеют префикс sv_ (примеры - sv_gravity, sv_clienttrace); Квары, влияющие только на клиент имеют префикс cl_ (cl_lw, cl_lc, cl_updaterate).

| Список кваров
Список кваров, назначение которых необходимо знать:
1) Клиентские:
cl_updaterate - количество пакетов в секунду, которое клиент хочет получать от сервера (именно хочет, но не факт что получит), 1/сек
cl_rate - исходящая полоса пропускание клиента (для данных от клиента к серву), байт/сек,
то есть максимальная скорость передачи данных к серверу
rate - входящая полоса пропускания клиента (для данных от сервера к клиенту), байт/сек, или максимальная скорость передачи данных к клиенту
net_graph - определяет тип отображения статистики по сетевому подключению. может принимать значения от 0 до 3 (об это позже)

2) Серверные:
sv_maxrate - максимальная скорость отдачи данных для одного клиента, байт/сек
sv_minrate - минимальная скорость отдачи данных для одного клиента, байт/сек
sv_maxupdaterate - максимальное количество пакетов в секунду, которое может быть передано одному клиенту.
sv_minupdaterate - минимальное количество пакетов в секунду, которое может быть передано одному клиенту.
sys_ticrate - определяет максимальное количество кадров, которые сервер может обсчитать за секунду. В хлдсе используется значение 1000/sys_ticrate (это в миллисекнудах) как интервал перерыва между обсчетом кадров.

| Матчасть. Как хлдс контролирует поток данных к клиентам.
Отдача данных в хлдс контролируется отдельно для каждого клиента, на основе двух факторов:
1) количество пакетов в секнуду, передаваемых клиенту, назовем это значение updrate
2) максимальная скорость передачи к клиенту, назовем это значение cmrate.

I. Исходными данными для определения updrate служат три переменные - это клиентская cl_updaterate, и серверные sv_maxupdaterate и sv_minupdaterate. Алгоритм определения updrate можно записать так:

updrate := cl_updaterate;
if updaterate > sv_maxupdaterate then updaterate = sv_maxupdaterate;
if updaterate < sv_minupdaterate then updaterate = sv_minupdaterate;


Видно, что по умолчанию updrate равен клиентскому значению. Однако оно не должно вылазить за пределы максимальных и минимальных значений, определенных в хлдс.

Вот несколько примеров для лучшего понимания:
cl_updaterate=30, sv_minupdaterate=20, sv_maxupdaterate=60. В Этом случае клиент будет получать от сервера 30 пакетов в секунду, т е что клиент хотел, то и получил.

cl_updaterate=100, sv_minupdaterate=20, sv_maxupdaterate=60. В Этом случае клиент будет получать от сервера 60 пакетов в секунду, тк значение уперлось в верхний порог.

cl_updaterate=10, sv_minupdaterate=20, sv_maxupdaterate=60. В Этом случае клиент будет получать от сервера 20 пакетов в секунду, тк значение уперлось в нижний порог.

II. Исходными данными для cmrate служат значения клиентской переменной rate и серверных sv_maxrate и sv_minrate. Алгоритм определения точно такой же, как и у updrate, то есть по умолчанию cmrate = rate, однако если значения вылазит за пределы sv_minrate или sv_maxrate, то оно ограничивается.

| Матчасть. Как хлдс формирует пакеты. Что такое choke. (Упрощенный вариант)
При работе хлдс все данные, которые должны быть посланы клиенту, складываются в отдельный буфер (он свой для каждого клиента), где и ждут момента, когда подойдет время их пересылки. Как только время подошло, данные начинаются записываться в пакет. На размер пакета накладывается ограничение по cmrate, чтобы не перегрузить полосу, отведенную клиенту. Максимальный размер пакета, связанный с этим ограничением, может быть вычислен как cmrate/updrate, то есть максимальная скорость делится на количество пакетов в секунду. Но что будет, если данных сервер сгенерировал больше, чем может отправить? Тогда все просто - в пакет записываются только данные, которые укладываются в максимальный лимит, остальные остаются ждать следующей пересылки. Так же в пакет дописывается однобайтовое сообщение svc_choke, которое сигнализирует о том, что хлдс не смог послать все данные, которые сгенерировал. Да, эти данные придут к клиенту в следующем пакете, однако придут они уже с задержкой. А если очередь данных на хлдсе разрастается и никогда не заканчивается, то на клиенте можно наблюдать нехилый такой рост пинга, и значение choke = 99 (его можно посмотреть в net_graph 3).
Отдельным пунктом стоит отметить то, что проверка на размер пакета осуществляется только если сервер работает в Internet режиме (sv_lan 0). При sv_lan 1 эта проверка отключается. Это может быть причиной появления лагов при переводе хлдса на sv_lan 0 при ненастроенных sv_maxrate/sv_minrate.
Edited by cs-msd on 22-12-2021 17:25
cs-msd.lv/images/182na44.png.png
 
Jump to Forum: