Ну наконец-то, добрался до одной из самых интересных тем — пинг в CS GO. Сколько бы парни не мерялись размерами, но здесь не в почете, когда он у тебя большой. Сколько он боли приносит, когда огромный и скачет. Сколько партий, сколько карт проиграно из-за него. И как само собой разумеющимся мы считаем, когда пинг не видно и не слышно. Сегодня пройдёмся по командам и посмотрим, как можно воздействовать на пресловутый пинг.
Прежде чем начнем бороться с пингом в CS GO, узнаем какие инструменты игра предлагает нам для борьбы с этой бедой. А так же посмотрим, что происходит и как они работают. Это необходимо для качественной настройки. Плюс к этому, загляните в предыдущую статью по настройке сетевой карты и фрагментации. Т.к. CS GO использует UDP.
Начнем с того, что CS GO это клиент-серверное приложение. Взаимодействуют они между собой путем обмена и пересылки небольших пакетов. Количество их учитывается за секунду. Сервер отправляет клиенту данные о положении игроков и объектов, а он на основе этих данных воспроизводит эффекты (анимацию, звук...). В свою очередь клиент CS GO, все данные которые поступают с клавиатуры и мышки, передает серваку, а он уже рассылает остальным КСерам изменения в игровом мире.
Теперь представим, что сотни игроков одновременно генерируют какие то события, двигают мышкой, печатают и т.д. Чтобы серверу каждые такие изменения отсылать от каждого к каждому и сразу, требовалось бы очень высокая пропускная способность и возможность справляться с постоянной нагрузкой. Генерировалось бы приличное количество трафика и была бы очень высока нагрузка на сам сервак, ввиду большого количества обсчета и изменений, что в конечном итоге влияло бы и на пинг. Обойти это помогает интервальный срез в игровом мире, через равные промежутки времени (tickrate).
Если у вас в CS GO очень низкая скорость, то при высоком tickrate высока вероятность поймать лаг, из-за потери пакетов, которые не доходили бы до клиента. Чтобы этого не было, во-первых нужно иметь достаточную ширину канала, во-вторых нужно сообщить, с какой гарантированной скоростью мы можем принимать данные, это так называемый rate (байт в секунду)
Клиент же тоже не всё сразу отсылает, а делает срез своих событий, только не игрового мира, а клавиатуры и мышки с определенной частотой (cl_cmdrate). Чем выше это значение, тем выше нагрузка, но качественнее и плавнее движения в игре.
Теперь касаемо самого пинга в CS GO и интерполяции (cl_interpolate). К примеру мы получаем 10 пакетов в секунду, тогда 1000 мс/10 = каждые 100 миллисекунд нам доставляются данные. Что будет, когда один будет ошибочным или потеряется или задержится и не дойдет до игрока? Будет лаг. Это не заметно, если все стоят и ничего не делают, но когда идет активное сражение с большим количеством перемещений и распрыжок? Для таких случаев придумана интерполяция. Она работает на клиенте, берутся два (или более) последних пакета и по ним рендерится положение объекта в игровом мире. Тут есть особенность, вывод изображения на экран с интерполяцией, делается как бы для прошлых событий, рассчитанных по формуле: текущее время-время интерполяции
Если при отправке нам 1,2,3,4 пакета, потерялся 3-ий, то CS GO рендерит изображение для третьего на основе 2 и 4-ого (текущего) и визуально резкого перемещения игрока в пространстве не происходит. Еще раз уточняю, что при интерполяции рендерится изображение не по текущему пакету, а для прошлого. Вы будете видеть игровой мир по третьему кадру, даже если уже дошел до вас четвертый. Рендеринг при этом всегда идет с отставанием.
Какое количество пакетов брать для сглаживания позиций, зависит от того сколько их приходит и каков уровень интерполяции в настройках клиента. Для примера:
20 пакетов и интерполяция 0,1 = 100/ (1000 мс/20)= 2
10 пакетов и интерполяции 1 = 1000/ (1000мс /10 )= 10.
Думаю понятно, чем выше уровень интерполяции, тем выше нагрузка.
При потере двух UDP, интерполяция отрабатывает неправильно. Тут спасает экстраполяция (cl_extrapolate). Она работает только для данных с задержкой до 0,25 секунд, если больше, то и она не спасает. Суть ее, в предсказании положения объектов на основе их поведения ранее. Т.е. при отправке 1,2,3,4 кадров, потеряны 3 и 4-ый (интерполяция не поможет тут), то для вывода данных по третьему положения рассчитываются на основе первого и второго.
Что можно еще сделать, при наличии задержки, особенно когда это касается нажатий, выстрелов, перемещений. Можно воспользоваться командой cl_predict. По-умолчанию все события обрабатываются сервером. При включении онной, события обрабатываются сначала на клиенте, но приоритет остается за первым. Другими словами, если данные по предсказанию разошлись, объекты будут смещены на позиции указанные сервером. При этом вероятен скачок изображения, для сглаживания таких скачков имеется команда cl_smooth и команда cl_smoothtime, растягивающая по времени такое сглаживание.
Предсказания это хорошо, но реально при высоком пинге в CS GO поможет серверная команда sv_unlag, а на клиентах это cl_lc, cl_lw, cl_lb. Представим, что вы видите врага и целитесь ему в область сострадания и чувственных наслаждений. При этом у соперника пинг на много ниже (20 мс), вы нажимаете выстрел и практически сразу же он прячется за угол. В этот момент вы упаковываете команду и отправляете её, она идет допустим 100 мс. При выключенном sv_unlag, от соперника кадр дойдет раньше и сервер посчитает, что вы промазали. При включенной команде, он начнет высчитывать время выполнения по формуле: Время сервера - пинг клиента - интерполяция клиента. В таком случае попадание будет засчитано.
Команды влияющие на пинг в CS GO
cl_rate — сколько байт может быть отправлено от клиента к серверу. (исходящая)
rate — клиент сообщает, сколько байт он может принять за одну секунду (входящая)
rate и cl_rate при настройке в идеале должны совпадать. Также данный размер нужно увязать с размером пакета (это мы рассмотрим позже), чтобы не было лишней фрагментации. Фактически эти параметры отражают скорость вашего тарифного плана у провайдера. Но, но, но скорость и пинг до разных серваков всегда разная.
Итак, значения рассчитываются по формуле:
rate=125000 байт\с =125000*8 =1 000 000 бит\с =1 000 000/1000 =1000 Кбит\с =1000/1000 =1 Мбит\с
rate=625000 байт\с =625000*8 =5 000 000 бит\с =5 000 000/1000 =5000 Кбит\с =5000/1000 =5 Мбит\с
rate=1250000 байт\с=1250000*8=10 000 000 бит\с=10 000 000/1000=10000 Кбит\с=10000/1000=10 Мбит\с
Если сомневаетесь в правильности своих расчетов, воспользуйтесь любым сервисом по переводу величин, коих в интернете полно
cl_cmdrate — сколько пакетов посылать от клиента к серверу CS GO. Это информация о вас. Достаточно установить значение на 5 выше, чем ваш фпс. Должно быть увязано с командой cl_rate. Хоть игроки и посылают данных меньше чем получают, но всё же рекомендуется cl_cmdrate выставлять равным cl_updaterate. А также для комфортной игры у всех игроков cl_cmdrate должен соответствовать tickrate.
cl_cmdbackup — сколько раз дублировать кадр с командами на сервер. Чем выше значение, тем выше должна быть пропускная способность канала. Используется на нестабильных соединениях. Необходимо этот параметр учитывать при настройке cl_rate.
cl_updaterate — сколько пакетов в секунду клиент может получать от сервера. Здесь мы получаем информацию о игровом мире. При настройке этого параметра учитывайте rate. Чем выше cl_updaterate, тем выше должен быть и rate. Если выставите cl_updaterate=100 и cl_rate=200000, то каждый пакет CS GO будет содержать 2000 байт (200000/100=2000), этого должно хватать с лихвой. Хоть сервер и посылает больше данных чем получает от каждого из игроков, но всё же рекомендуется cl_cmdrate выставлять равным cl_updaterate. У данной команды есть особенность, получать данные вы можете в зависимости от того, какой выставлен tickrate или из-за выставленных администратором команд sv_minupdaterate и sv_maxupdaterate. А также установленных sv_minrate и sv_maxrate
cl_smoothtime — диапазон 0 до 1. Убирает раздражающее дерганье моделей при предсказании. Описание смотри выше.
Что нужно сделать, прежде чем уменьшить пинг в CS GO?
tickrate
Перво-наперво узнаем его. Большинство серваков CS GO имеет значение равное 66. Т.е. каждые 1000мс\66=15 мс, он делает срез игрового мира, рассчитывает и изменяет положения объектов и рассылает всем изменения. tickrate=128 встречается реже и требует приличных ресурсов на стороне сервера, чтоб 1000/128=7,8 мс делать обсчеты. То что он делает рассылку каждые 15 мс, не значит что все одновремено принимают срезы каждые 15 мс. Прием данных зависит еще от настроек клиента и серверных переменных. А также tickrate прямо связан с FPS на самом сервере. Выше FPS tickrate быть не может.
rate
Архимегаважный параметр. Прям ваще ваще. Чуть не так выставили и все, получите лаги, задержку , высокий пинг в CS GO и прочую нечисть. Данным параметром мы сообщаем, сколько байт мы готовы принять от сервера за одну секунду. Тут главное не напортачить и не поставить ниже, реальной ширины канала. Расчеты как вычислить правильное значение приведены выше. А также нужно обратить внимание на переменные sv_maxrate и sv_minrate.
sv_minrate, sv_maxrate - ограничение входящей скорости для клиента (байт в секунду). Если ваш rate больше sv_maxrate, то настройки будут браться из sv_maxrate. И наоборот, когда меньше, то из sv_minrate. Соответственно нужно знать всегда на каком сервере какие параметры будут использоваться у вас в действительности. Не будьте уверены, что они везде и всегда такие, какие вы указали в конфигурации.Перепроверяйте.
cl_updaterate
Сколько пакетов игрок может получить от сервера.
Что будет прилетать при tickrate=66 если вы выставите cl_updaterate=100? Вы будете получать снимки игрового мира 66 штук в секунду. Выставите cl_updaterate=33? Будете получать 33 снимка в секунду. А также сервер не будет посылать снимков больше, чем позволит ваша скорость (rate). Когда при tickrate=100, ваш канал позволяет принять только 90 кадров, то остальные 10 будут потеряны, а это лаги. Потому что он вам доверяет и считает, что вы честно провели ревизию сетевой части и правильно рассчитали все настройки. На себя он обязательств по доставке этих 10 штук не берет. Rate можно установить выше реальной скорости, но вот с cl_updaterate такая фишка не пройдет. Также нужно обратить внимание на команды выставленные администратором:
sv_maxupdaterate, sv_minupdaterate - ограничение по пакетам в секунду.
И надо помнить, вы не можете получить больше данных, чем FPS самого сервера. Даже если на нем выставлено 100, но фпс при этом 60.
cl_cmdrate
Сколько пакетов клиент может послать серверу.
Здесь также прямая зависимость от фпс и cl_rare. Все данные, по нажатию клавиш и движения мышкой, попадают в клиентские срезы. Данные от него уходят не сразу, а могут накапливаться и только после этого отправляться. В идеале, чтобы игра была качественной для всех и чувствовалось удовлетворение от нее, отправка должна быть равна tickrate или больше. Поставите заниженный cl_cmdrate, то в игре у вас визуально пинг станет меньше и в вас сложней будет попасть, но будет дерганье картинки. Идет в связке с с cl_rate. При настройке не забывайте еще про такие команды:
sv_mincmdrate, sv_maxcmdrate - ограничение по пакетам от клиента к серверу
Размер пакета
Чтобы снизить пинг в CS GO из-за фрагментации, нужно учесть размер нефрагментированной части.
К примеру мы выяснили, что в ОС пакет проходит нефрагментированным в размере 1400 байт (см. первую часть). У себя в игре мы выставили rate = 196608, cl_rate = 196608, cl_cmdrate=66, cl_updaterate=66, cl_cmdbackup=1
Итого: 196608/66=2979 байт в одном пакете от CS GO. При отправке таких данных он будет фрагментирован на три части 1400+1400+179. С нашей точки зрения 179 байтами можно попробовать пожертвовать ради уменьшения пинга и оптимизации ресурсов и снизить rate до 184000. В таком случае пакет будет объемом 2788 байт, то есть вместо трех фрагментов, будет два (1400+1378=2788). Таким образом мы страхуемся от того, если сетевое оборудование или сервер, на этапе следования сетевого трафика, будет отрабатывать медленно, наш пинг (при двух фрагментах), вырастет не так сильно (как при трех). Но не забудьте, изменение rate (cl_rate) это очень чувствительный параметр. Не снижайте его сильно и резко, могут появиться лаги. И учитывайте cl_cmdrate, cl_updaterate, cl_cmdbackup. В идеале вашей скорости с лихвой должно хватать, чтобы вы свободно играли этой командой.
Не утверждаю что данное средство с учетом фрагментации панацея, но раз вы взялись за настройку сетевой части в игре, подходите к проблеме комплексно и старайтесь учесть все моменты, как на уровне приложения, так и на уровне ОС и сетевом уровне. Ищите узкие моменты и закладывайте решение в своих настройках.
Дополнительные команды помогут при настройке пинга в CS GO:
- cl_allowdownload — Разрешить скачивание с сервера спреев, текстур, моделей, карт, звуков и т.д.
- cl_allowupload — Разрешить загрузку на сервер данных: личного спрея и т.д.
- cl_download_ingame — Команда отвечает за скачивание чужих моделей и декалей во время игры.
- cl_lc — Клиент CS GO учитывает пинг и задействует лагокомпенсацию. При sv_unlag=0 данный пункт не работает
- cl_lw — Клиент CS GO учитывает пинг и задействует лагокомпенсацию при использовании оружия. При sv_unlag=0 данный пункт не работает
- cl_lb — Клиент CS GO учитывает пинг и задействует лагокомпенсацию при использовании эффектов. При sv_unlag=0 данный пункт не работает
- сl_nopred — Отключить предсказание движения на клиенте
- cl_nodelta — Отключить дельта сжатие. То есть будут передаваться все данные, а не разность между ними. Увеличивает нагрузку на сеть.
- cl_resend — Время в секундах, через которое будет повторное подключение к серваку
- cl_latency — Имитация задержки
- pushlatency — Отображение на клиенте не текущего положения игрока, а того места где он будет, когда данные дойдут до сервера. Выставляется как отрицательное значение.
- fullinfo — Информация о пользователе
- fullserverinfo — Полная информация о сервере
- pingservers — Отображение пинга из списка серверов
- pingsv — Пинг сервера
- serverinfo — Информация о сервере
- status — Список о всех игроках и информацию к каждому: номер, количество фрагов, имя, количество ФПС, пинг, процент потерь
- cmdlist — Список всех команд
- cvarlist — Выводит список переменных
- cl_shownet — Отображение сетевой информации
- net_graph — График отображения сетевой активности
Друзья, пинг в CS GO не лечится легко. То, что мы сейчас сделали, позволит привести настройки игры к разумному соответствию. Объективно, сильно снизить пинг получится сменой сервака или провайдера, но если это не всегда возможно, то конечно пробуйте приводить сетевую часть в порядок. Возможно кому то эта статья облегчит жизнь в баталиях.
- Информация о материале
- Опубликовано: 18.01.2018 г.