Как работает компенсация лагов в Left 4 Dead (Source engine)
Введение
Итак, игра у нас типичная и клиент-серверная, где сервер занимается следующими вещами:
• симуляция мира вокруг
• отработка движка игры
• обработка командочек пользователя
• игровой мир рассчитывается каждые N ms (эта штука называется внутренний tickrate сервера, для l4d1 и l4d2 = 30)
Клиент посылает серверу команды по UDP
• клиент получает эти данные, и на основе них генерит вам картину мира, воспроизводит звуки, события итп
• UDP это пакеты по 10-200байт, без установления соединения (в отличие от TCP), оверхед примерно 20 байт служебной инфы + данные
• посылается примерно 20-30 пакетов в секунду, это и есть серверный cmd_rate — он может быть от 20 до 30.
• клиент может пожаловаться серверу что он имеет плохой канал итп.. и запросить «худшие» значения по качеству вот этими параметрами
sv_minrate \ sv_maxrate — мин и макс значение в байтах сколько он готов принимать
sv_minupdaterate\sv_maxupdaterate — то же самое в командах
cl_updaterate — а это типа дефолтное «рабочее» значение
• полные «обновления» посылаются толлько при загрузке игры, затем шлется только дельта
итак, от чего зависит качество вашей игры
• загрузка цп клиента
• загрузка цп сервера
• среднее время на прием и предачу ответа от сервера (ping или round trip time)
чтобы игра была интересной важно чтобы доли секунды реально что-то значили.
итак чтобы бороться со всей этой фигней, в движке source встроено аж 3 механизма
Entity interpolation
Это предсказание поведения физики\объектов карты на клиенте, работает следующим образом:
• берется n последних пакетов (cl_extrapolate_amount), берется ваш текущий FPS ( cl_showfps 1 ) и рассчитывается следующий кадр и местоположение объектов для которых физика и считается (полет ящика, бросок канистры, танк пнул машинку)
• если пакеты доходят с потерями — то буфер старых пакетов пуст и делать интерполяцию особо не по чему — тут вступает в игру экстраполяция ( cl_extrapolate 1 ) — движок на клиенте пытается округлить вперед (уже довольно грубо) что же творится на карте.
• эффект экстраполяции ограничен по времени — 0.25s после последнего пакета с сервера — чтобы не внести сильные искажения
• итак вот мы пришли к cl_interp
• cl_interp_ratio = сколько последних пакетов использовать для «округления» вашей картины мира (чем больше = тем дальше от реальности на сервере, но тем плавнее)
• cl_updaterate = кол-во команд с сервера, в общем то это константа равная 20..30
Input prediction
допустим у нас пинг 150ms и мы нажали w — сервер узнает об этом только чз 150ms; еще через некоторое время он рассчитает куда же мы переместились; потом он разошлет это всем другим клиентам; и нам придет назад пакет с информацией; и тут мы уже «реально» переместились вперед на метр… как-то так
чтобы не было таких дерганий — движок на клиенте САМ двигает нас вперед не дожидаясь подтверждения от сервера (замечу — реальность на сервере — САМАЯ правильная, т.е. то что на клиенте — неважно)
поэтому так бывает — мы куда-то забежали — клиент это показал — сервер подумал и исправил неправильное округление клиента — вернув назад нас же резким рывком :\
• вся эта котовасия включается по дефолту ( cl_predict 1 )
• само сглаживание происходит на время cl_smoothtime
Lag compensation
мы видим врага бегущего мимо и стреляем ему в голову
• X ms пакет с инф о выстреле пакуется
• Y ms он едет на сервер
• Zms сервер его переваривает, и через время Z+Y+X ваш враг уже убежал..
что же делает движок?
• он помнит все события на сервере за последнюю секунду… при этом он отматывает НАЗАД. время и проверяет где тогда был ваш враг — если он был на линии выстрела — засчитывается хит.. бабац. попали.. и во время очередного тика на сервере всем клиентам рассылается информация что вы попали..
именно за счет lag compensation появляются вот такие перлы
(игроки часто думают что это баг игры.. лол)
на пальцах — эта известная картинка показывает модельку (то что в текстурах) которую видит клиент и реальные серверные хит-боксы (белым) которые отстают — и показывают то что видит сервер.
• всё это side-effect от lag compensation.
итого имеем lag compensation + entity interpolation + client prediction,
именно поэтому так важен низкий пинг и отсутствие потерь — иначе косячные атаки, длинные руки, тормозящие насмерть зомби и прочая ерунда.
основной фокус этого текста — объяснить как оно работать внутри,
cl_interp — интерполяция в CS:GO
cl_interp уже не используется в кс го, и сейчас настройку интерполяции можно рассмотреть с помощью других команд. О них подробнее и поговорим…
Содержание
Интерполяция в CS:GO
Интерполяция может колоссально повлиять на ваш геймплей. Неправильные настройки могут делать вашу игру ужасной. Если у вас были моменты когда вы стреляете, но ничего не засчитывает, возможно это именно траблы с неверными настройками интерполяции. Вот вам яркий пример:
Все это происходит из-за пинга. Вы можете видеть противника на своем мониторе, но на самом деле он находится в другой позиции. Простыми словами мы видим прошлое, но в момент выстрела сервер говорит что там никого нет.
Для того чтобы избежать подобных разногласий между вами и сервером, разработчики придумали команду cl_lagcompensation. Данная команда компенсирует ту самую разницу в пинге. Если вы включите данную команду, наш компьютер будет отправлять доказательства на сервер, а именно что противник был у нас на прицеле
Сама же команда вводится в классической консоли с помощью ввода
cl_lagcompensation 1
Бывало ли у вас когда вы зашли за стену, но вас убивают?
Если ваш ответ — «да», то это от части действия этой команды. Например, вы спрятались за стенку, но у игрока у которого большой пинг, вы все еще на мониторе. Он убивает вас, ведь его компьютер отправил на сервер подтверждение. Также, на это влияет и ваш пинг, ведь информацию, что вы все таки спрятались за стенку, будет доставляться долго. Если все два этих фактора накладываются, случается нечто подобное. Но это лишь излишки, ведь реальная польза от компенсации гораздо больше.
Всегда перед стартом игры прописывайте в консоли:
Но давайте сперва разберемся — что же такое интерполяция?
cl_interpolate 0
cl_interpolate 1
Теперь посмотрим на движение модельки со включенной интерполяцией
Как можно увидеть модель двигается очень плавно, потому что, теперь работает рендеринг. И даже в случае если из-за интернета мы потеряем тик, моделька по-прежнему будет плавно двигаться. Чтобы погрузится в суть этого, нужно посмотреть на скрин ниже:
Вертикальные палочки визуализирую пакеты которые мы получаем с сервера (тики). Как можно понять, то что мы видим на своих экранах во время игры, на самом деле отстает на два тика, то есть мы видим прошлое. Это происходит, потому что интерполяция будет ждать, пока еще не придут два тика (пакета данных), чтобы на их основе давать плавные движения окружающих объектов в игре
Внимательно посмотрев на фото, можно увидеть что между промежутками тика у нас есть задержка. Мы расчесывали длину тика, разделив одну секунду на количество самих тиков. В обычном матчмейкинге их 64, по этому формула выглядит так: 1000/64=15.625 мс – это точная задержка когда мы играем в ММ
cl_interp_ratio
Но как мы уже говорили, интерполяция добавляет искусственную задержку — это прошлое. По этому она подождет еще два тика. И если мы удвоим все данные, реальная задержка будет выглядеть так: 15.625*2=31.25 мс.
Эта задержка добавляется что бы сделать игру плавной. Но ее можно регулировать в зависимости от нужд. Для этого в кс го есть команда cl_interp_ratio. К CS:GO есть лимит и мы можем выставить только два значения:
cl_interp
В прошлом использовать команда cl_interp, в ней можно было ввести задержку интерполяции в секундах.
ВАЖНО:
Но в поздних версиях Source, interp контролируется командой cl_interp_ratio. Дело в том что разработчики просто забыли удалить команду из игры и теперь она гуляет по различным гайдам в интернете и путает людей. Проверить данный факт и убедится своими глазами довольно просто:
Для теста cl_interp нужно вводить меню, когда вы находитесь на карте ничего не поменяется. Во время теста легко убедится, что ничего не меняется, чего и следовало ожидать.
Если после всего если вы думаете что нужно использовать cl_interp_ratio 1, думая что задержки лучше убрать, вы будете не правы.
И так:
В другом случае пользуемся такой шпаргалкой:
ПОЛЕЗНАЯ СТАТЬЯ: Пропал интернет? Горит « Подключение к сети кс го «
Ниже по ссылке есть таблица с собранной статистикой, где отчетливо видно как влияют те или иные настройки на игру:

Заметно что большинство кто играет с сl_interp_ratio 1 имеют значительную просадку в статистике по убийствам в эру интернет турниров. Может ли это означать, что настройки так сильно влияют на игрока остается пищей для размышлений, но подтверждений полно. Вот полная таблица выглядит таким образом.
Пользуйтесь проверенной информацией, ведь возможно она вам
поможет выйти на новый уровень игры.
lag compensation
1 lag compensation
коррекция на отставание по фазе
—
[Л.Г.Суменко. Англо-русский словарь по информационным технологиям. М.: ГП ЦНИИС, 2003.]
Тематики
2 lag compensation
3 lag compensation
4 lag compensation
5 lag compensation
6 lag compensation
7 lag compensation
8 lag compensation
9 lag compensation
10 lag compensation
11 lag compensation
12 lag compensation
13 lag compensation
См. также в других словарях:
Frequency compensation — In electrical engineering, frequency compensation is a technique used in amplifiers, and especially in amplifiers employing negative feedback. It usually has two primary goals: To avoid the unintentional creation of positive feedback, which will… … Wikipedia
Operational amplifier applications — This article illustrates some typical applications of operational amplifiers. A simplified schematic notation is used, and the reader is reminded that many details such as device selection and power supply connections are not shown. Contents 1… … Wikipedia
Tube sound — (or valve sound) is the characteristic sound associated with a vacuum tube based audio amplifiers. Some audiophiles prefer the sound that is produced by the distortion characteristics of tube based amplifiers. The audible significance of tube… … Wikipedia
Online-Game — Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung. Online Spiele (auch bekannt als Internet Spiele) sind… … Deutsch Wikipedia
Onlinegame — Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung. Online Spiele (auch bekannt als Internet Spiele) sind… … Deutsch Wikipedia
Onlinespiel — Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung. Online Spiele (auch bekannt als Internet Spiele) sind… … Deutsch Wikipedia
Audio amplifier — An audio amplifier is an electronic amplifier that amplifies low power audio signals (signals composed primarily of frequencies between 20 hertz to 20,000 hertz, the human range of hearing) to a level suitable for driving loudspeakers and is the… … Wikipedia
Electronic engineering — is a discipline dealing with the behavior and effects of electrons (as in electron tubes and transistors) and with electronic devices, systems, or equipment.The term now also covers a large part of electrical engineering degree courses as studied … Wikipedia
Education and training of electrical and electronics engineers — Both electrical and electronics engineers typically possess an academic degree with a major in electrical/ electronics engineering. The length of study for such a degree is usually three or four years and the completed degree may be designated as … Wikipedia
Deflection (military) — Deflection is a technique used for effectively firing a ranged weapon at a moving target, that describes leading the target ; that is, shooting ahead of a moving target so that the target and projectile will collide. This technique is only… … Wikipedia
коррекция на отставание по фазе — — [Л.Г.Суменко. Англо русский словарь по информационным технологиям. М.: ГП ЦНИИС, 2003.] Тематики информационные технологии в целом EN lag compensation … Справочник технического переводчика
Lag compensation что это
Okay, so why this plugin?
The source engine has lag compensation for player entities ONLY.
Anything else that’s moving around in the server is NOT lag compensated.
This plugin fixes this for the most part.
It provides accurate and cheap (no interpolation between two snapshots) lag compensation for trigger_
It does this automatically and avoids breaking
How does it work?
The plugin remembers the last 32 (configurable) states of up to 256 (configurable) entities.
It keeps track if entities are actually moving and only compensates them if they are.
There are barely any performance implications of running this plugin, especially because it also optimizes how triggers work. If a trigger is lag compensated it will not run any physics simulation any more.
Usually a moving trigger would be actively scanning and touching any entity in its collision hull.
To make lag compensation possible this is blocked with the PhysHooks extension and now only players will be touching triggers.
Before a player is simulated, all (active/moving) entities are moved to where they are on their screen. This is done for each player.
At the end of the player simulation loop the compensated entities are restored to their server state.
After the entities have been simulated their parameters are recorded.
Issues
Moving platforms/trains are not lag compensated. If a trigger is parented to it, it will be lag compensated however.
Imagine a thin platform with a kill trigger parented on the bottom of it. If a player stands on the platform and it moves up the trigger on the bottom will move through the platform, into the player and kill them.
In this case you’ll have to modify the map with something like stripper-source and add the no-lagcomp flag to the trigger.
Only letting players touch triggers comes with some issues on CS:S however, if a player stops sending packets to the server they are not simulated at all any more. Hence they will not touch any triggers that move through them.
CS:GO seems to have a fix for this in built. For CS:S I’ve included a plugin AntiLagSwitch which forces player simulation with empty packets after the server didn’t hear from them for 16 ticks.
Because source has no client side prediction of triggers and we can’t cheat the laws of physics something else has to be delayed now: death.
You play with 300ms ping and seemingly jump over a laser, only to die after it has already passed you.
A smart player will obviously scream «fucking 0 ping botox you gamer-word» into the voice chat.
A not-so-smart player will realize they made a mistake and it’s just the information of their death which had to travel for 300ms before reaching them.
3rd person and server demos view for players with lag compensation enabled will look weird, they will touch lasers on your screen but not die.
This makes sense of course because on their screen they’ve jumped over the laser, that’s the whole point of lag compensation.
To get an accurate view of their screen the demo needs to be recorded in their client.
Usage
Install the DHooks + Detours extension: https://forums.alliedmods.net/showpo. &postcount=589
Install the PhysHooks extension: https://forums.alliedmods.net/showth. 09#post2684809
Install the LagCompensation.smx into your plugins/ folder and LagCompensation.games.txt into your gamedata/ folder.
If you want to avoid a trigger (or physbox) from being lag compensated by this plugin then you can add the value 1073741824 (1 to the spawnflags of the entity.
Thanks to:
All players and staff of UNLOZE Zombie Escape server.
While developing this plugin there have been many bugs and weird things happening for weeks.
Thanks for not pulling the plug and letting me continue working on this until all issues have been fixed.
Special thanks to xen for a lot of help with testing and investigating issues.
POSSESSION and ZombiEden for testing the CS:GO Win32 version and helping with windows signatures.
Obviously the SourceMod project, without SourceMod most of our mods would be incredibly harder or outright not possible.
Dr!fter and Pyschonic for DHooks + Detours.
The leaked 2007 engine source code provided insight into the depths of the engine, PhysHooks makes heavy use of this.
What is lag compensation?
Specifically in regard to online games, what is lag compensation? Should it affect the way I play?
2 Answers 2
Valve published an excellent article explaining the multiplayer network details (also called «netcode») of their multiplayer games. From this article:
Lag compensation
Let’s say a player shoots at a target at client time 10.5. The firing information is packed into a user command and sent to the server. While the packet is on its way through the network, the server continues to simulate the world, and the target might have moved to a different position. The user command arrives at server time 10.6 and the server wouldn’t detect the hit, even though the player has aimed exactly at the target. This error is corrected by the server-side lag compensation.
The lag compensation system keeps a history of all recent player positions for one second. If a user command is executed, the server estimates at what time the command was created as follows:
This screenshot was taken on a listen server with 200 milliseconds of lag (using net_fakelag), right after the server confirmed the hit. The red hitbox shows the target position on the client where it was 100 milliseconds ago. Since then, the target continued to move to the left while the user command was travelling to the server. After the user command arrived, the server restored the target position (blue hitbox) based on the estimated command execution time. The server traces the shot and confirms the hit (the client sees blood effects).
The source code implementing this is publicly available as part of the Source SDK.
















