Про lerp і його особливості - корисне - каталог статей - clan rgzone

Про lerp і його особливості

Як ви знаєте, після річного поновлення мережевий код DoD: S був змінений. З'явилося кілька нових змінних і кілька старих прибрано. Про їхнє значення і піде мова.
невеликий лікнеп

Клієнт-сервер - мережевий код гри створений на основі обміну пакетами між сервером і клієнтом. У цих пакетах інформація про поточний стан ігрового світу (розташуванні об'єктів і т.д.)
cl_updaterate - число пакетів які клієнт отримує від сервера кожну секунду.
Інтерполяція - отримання проміжних значень будь-якої величини, шляхом усереднення крайніх. Інтерполяція служить для згладжування картинки, тому що пакетів приходять від сервера часто не вистачає для того, щоб картинка виглядала плавно.
Налаштування клієнтської частини за замовчуванням: cl_updaterate 20; cl_interp_ratio 2; cl_interp 0.1.
Як це працює

cl_updaterate 20 означає, що клієнт буде отримувати від сервера пакети 20 раз в секунду, різниця між пакетами - 50 мс. Щоб запобігти лаганіе від можливої ​​втрати пакета, інтерполяція повинна відбуватися в проміжок часу рівний 2 * 50 = 100 мс. Щоб забезпечити таку інтерполяцію, необхідно задати параметр cl_interp 0.1. Множник два означає, що ми хочемо інтерполювати дві області між трьома пакетами прийшли від сервера: "._._.". Якщо ми хочемо ітерполіровать тільки одну область "._.", Ми повинні змінити відповідний параметр. Цим параметром є змінна cl_interp_ratio. Вона може приймати значення 2, 1, 0. Як не складно здогадатися, якщо ця змінна дорівнює нулю, то інтерполяція на клієнті буде відсутній. У загальному випадку формула для проміжку така: lerp = cl_interp. але не може бути менше cl_interp_ratio / cl_updaterate. Отже, тут ми приходимо до самого визначення:

lerp - проміжок часу в якому пакети отримані клієнтом будуть інтерполювати.

По суті, значення lerp визначає пропорцію між пакетами, які прийшли від сервера, і пакетами, згенерували на клієнті. Чим менше значення lerp, тим менше пакетів буде "придумано" на стороні клієнта, тим точніше те, що ви бачите, буде відповідати тому, що відбувається на сервері. Чим більше значення lerp, тим більшу частку в вашій картинці буде грати інтерполяція.

Після теорії перейдемо до практики. З самого початку здається, що в ідеалі lerp має дорівнювати 0. адже при такому значенні lerp немає інтерполяції і клієнт бачить те саме, що бачить сервер. Ви НЕ можете собі дозволити lerp = 0 з двох причин.

1) Ваш інтернет канал залишає бажати кращого.
Припустимо, що ви щасливий володар модему або в вашому місті широкосмуговий інтернет поки по кишені тільки обраним або ваш сусід по гуртожитку вечорами заливає на торрент пачку свіжих німецьких фільмів. Це означає, що ви можете собі дозволити виключно скромні мережеві настройки. Швидше за все ті, що стоять за замовчуванням, а можливо ваші справи ще гірше. При cl_updaterate 20. навіть якщо все пакети благополучно приходять від сервера до клієнта, ви бачите 20 кадрів в секунду (не має значення, який у вас комп'ютер). Людське око сприймає цю картинку як смикання. Якщо ж, не дай бог, втрати (choke) є, то грати ви просто не зможете, так як будете бачити слайдшоу.

2) Налаштування серверів не дозволяють клієнтської частини виставляти необхідні значення деяких змінних.
Головна проблема тут безумовно cl_interp_ratio. на даний момент жоден європейський серверний конфіг не дозволяє грати з цієї змінної дорівнює нулю. На даний момент я не знаю жодного паблік з такими настройками. Тільки кілька КВ-серверів дозволяють відключати інтерполяцію. Зараз додавання sv_client_min_interp_ratio 0 (ця команда відповідає за мінімальне значення cl_inerp_ratio. Яке може мати клієнт перебуваючи на цьому сервері) в евроконфіге швидше за все питання часу, і я пологаю, чекати залишилося не довго. Але факт залишається фактом: значення цієї серверної змінної за замовчуванням дорівнює 1, а це значить, що клієнт не може зробити lerp менше, ніж 10 мс.

1) Напишіть в консолі cl_updaterate і запам'ятайте значення цієї змінної
2) Напишіть в консолі cl_interp_ratio 1
3) Розділіть 1 на значення cl_updaterate
4) Напишіть в консолі cl_interp і надайте йому то що отримали в пункті 3

наприклад:
Я граю з cl_updaterate 66. це значить що в 3 пункті я отримаю 0.0152. отже мені потрібно написати cl_interp 0.0152. Це дасть мені lerp = 15. Що вже досить непогано. Так як інтерполяція таких часових проміжків не дуже сильно додає неточності вашим діям.
Якщо ви пишете значення cl_interp менше, ніж cl_interp_ratio / cl_updaterate. то на net_graph lerp буде відображатися помаранчевим кольором. Якщо ж lerp забарвлений в жовтий. то значить значення lerp більше проміжку часу між відсилає пакетами на цьому сервері. В обох випадках lerp (а значить cl_interp) потрібно збільшувати поки той не стане білим. Якщо ви будете намагатися грати з НЕ білим lerp. то ви прирікаєте частину своїх пострілів застрявати в проміжку клієнт-сервер.

Домагайтеся мінімального значення lerp. залишаючи його білим на кожному сервері, на якому граєте. Це дозволить вам знизити до мінімуму всі проблеми, пов'язані з вашим з'єднанням з інтернетом.

На останок зауважу, що існує міф, нібито lerp має дорівнювати пінг. Пінг - час за який пакет доходить від сервера до клієнта і він не має ніякого відношення до інтерполяції. Марно намагатися знайти зв'язку в цих двох поняттях. При будь-якому пінг зберігайте lerp мінімальним і білим.

Щоб не паритися з математикою, можна забіндити клавіші так:

alias lerpa + "incrementvar cl_interp 0.01 0.09 +0.0001" // cl_interp +0.0001
alias lerpa- "incrementvar cl_interp 0.01 0.09 -0.0001" // cl_interp -0.0001
alias lerpb + "incrementvar cl_interp 0.01 0.09 +0.001" // cl_interp +0.001
alias lerpb- "incrementvar cl_interp 0.01 0.09 -0.001" // cl_interp -0.001
alias lerpc + "incrementvar cl_interp 0.01 0.09 +0.01" // cl_interp +0.01
alias lerpc- "incrementvar cl_interp 0.01 0.09 -0.01" // cl_interp +0.01

bind "INS" "lerpa +"
bind "DEL" "lerpa-"
bind "HOME" "lerpb +"
bind "END" "lerpb-"
bind "PGUP" "lerpc +"
bind "PGDN" "lerpc-"