[Redacted]? Или Hsr По-Рыбьи
#1
Posted 28 May 2014 - 09:19 AM
Ну, или что такое "Лаг-шилд" (lag-shield) наглядно.
Все мы прекрасно знаем, что в игре есть такая замечательная фича как HSR (Host State Rewind - "серверная перемотка"). Эта такая приблуда, которая позволяет игрокам с большим пингом стрелять в мехов противника туда, где они видят их на экране своих мониторов, а не в пустое пространство перед ними, угадывая их реальное местоположение. Также мы прекрасно осведомлены о том, что этот самый ХСР не работает - это хорошо заметно при стрельбе при пинге 150+ по лайтам с пингом меньше 100. Лазеры не режут, СРМ-ки не дамажат. При попытке стрелять СРМками при собственном пинге 200+ можно в упор промахиваться по атласу с пингом 50... Рыбы честно признались, что не в курсе как порешать проблему с нерабочим кодом. Ответ лежит на поверхности, игроками уже несколько раз указывалось на косяк в принципе действия перемотки... Только вот рыбы не общаются с комьюнити. ВООБЩЕ. Так что надежд на фикс данной багофичи нет - сами они вряд ли смогут догадаться
Остается нести доброе-светлое-вечное в массы, просвещать новичков так сказать.
Как работает эта штука. Смотрим на картинку.
У нас есть игрок А и игрок В, которые перемещаются в пространстве-времени. Информация об их местоположении, скорости, действиях и т.п. приходит на сервер с запозданием, соответственно, для игрока А - с пингом А, и для игрока В - с пингом В.
Для простоты рассматриваемой картины принято, что пинг игрока В больше пинга игрока А, и игрок В стреляет мгновенно попадающим оружием (лазерами, к примеру).
Между двумя фиолетовыми линиями в центре показано как сервер воспринимает положение игроков с течением времени, выше показано РЕАЛЬНОЕ положение игрока А, ниже - РЕАЛЬНОЕ положение игрока В.
Так вот, эти два игрока бегают-прыгают, занимаются своими делами, и, наконец, находят друг друга (пусть это будет кольцо на Терме - самая часто выпадающая карта все-таки ). Момент встречи обзовем "точкой отсчета", "zero-point", "0-point" или как угодно. На рисунке отмечено зелененькими кружками на стороне сервера. Игроки еще не в курсе, что они видят друг друга, потому что информация, идущая от сервера на их компьютеры, запаздывает (на пинг А и В).
Ну а теперь самое интересное. Информация от сервера идет к игроку В за время его пинга (показано синей стрелкой). За это время игрок А перемещается в РЕАЛЬНОМ пространстве до позиции, показанной фиолетовым пунктиром, но, опять же, информация о местоположении игрока А немного запаздывает, и сервер "думает", что игрок А находится на пару метров позади своего реального местоположения (фиолетовый пунктирный кружочек на линии сервера).
Информация дошла до игрока В. Все! ЗАЛП!!! Все лазеры ушли в цель!!! (напоминаю, игрок В видит картину, показанную зеленым!).
Информация о выстреле побежала обратно до сервера (вертикальная фиолетовая стрелка). За это время игрок А переместится еще дальше от первоначального местоположения (от "точки отсчета"). Теперь он находится в точке 1 ("1-point" как я ее на картинке обозвал). Выстрел игрока доходит до сервера в также в точке "1", только эта точка "1" для игрока В немножко другая (показано на рисунке связанными стрелочками).
Включается рыбья приблуда ХСР, которая "перематывает назад" время на сервере, равное пингу игрока В. Что из этого выходит - показано на рисунке желтым цветом. FAIL Почему так? Потому что пираньи не учли в коде перемотки РАЗНИЦУ в пингах игрока А и В.
Из этого вытекают следующие выводы:
1) Важен не абсолютный пинг игрока, а конкретная разница между Вами и вашим виртуальным врагом. Игрок с пингом 50 мс будет лагать для игрока с пингом 100 мс ровно так же, как и последний будет лагать для игрока с пингом 150 мс.
2) Игрок А находится в абсолютном шоколаде - он видит игрока В в том месте, где его уже давно нет, и при этом игрок В получит 100% повреждений все равно.
3) Игроку В нет смысла "крутить торсом" когда он видит вспышки лазеров - он УЖЕ получил 100% повреждений. Поэтому - сначала отворачиваем фэйс, а уже потом, после выстрела противника, поворачиваемся сами и стреляем. Ну и снова отворачиваемся ДО! выстрела игрока А.
4) Игроки с равным пингом находятся в равных условиях (даже если оба играют какой-нибудь Папуа-Новой Гвинеи с пингом больше 10 секунд) - противник на сервере для них находится ровно в том месте где они его видят.
Ну а пираньям... ХСР должен работать по принципу: для каждого из 24 игроков в команде сервер должен 23 раза перематывать назад фреймы соответственно пингу каждого из оставшихся 23 игроков, играющих вместе с ним.
Многа букаф, сам ниасилил Если у кого есть желание - можете перевести на английский, ну или даже разрабам ссылку кинуть - они все равно забьют
#2
Posted 28 May 2014 - 11:53 PM
#3
Posted 29 May 2014 - 12:55 AM
Вкратце нужно просто делать поправку на учёт задержки игрока В при получении сервером команды на анализ позиций, чтобы позиции на сервере совпадали. Тогда HSR заработает? Я правильно понял?
#4
Posted 29 May 2014 - 05:39 AM
Leonid, on 28 May 2014 - 11:53 PM, said:
"Клиент-серверную" архитектуру на плоской картинке изобразить, не прибегая к использованию 3-4-5 координатных осей, ну ООООЧЕНЬ сложно Поэтому такая каша получается.
Bulef, on 29 May 2014 - 12:55 AM, said:
Именно. Можно это представить в виде нескольких режиссеров, которые решили снимать фильм по одному сценарию. Каждый режиссер снял бы этот фильм по-своему, и ключевые кадры у них в чем-то, пусть в мелочах, но различались бы.
Если представить совокупность расположений всех игроков на сервере в какой-либо конкретный момент как единый "кадр" (фрейм), то эти "кадры" в разных фильмах выглядят по-разному, начиная от начальных титров и заканчивая "The End"ом.
Bulef, on 29 May 2014 - 12:55 AM, said:
Не совсем так. См. пункт первый выводов. Важен не абсолютный пинг игрока, а конкретная разница в пингах игрока А и В. То есть, в игре участвуют 24 динамических объектов - 24 меха игроков. При работе ХСР для конкретного Васи (Коли, Пети...) сервер сначала должен отмотать "фреймы" назад на величину пинга этого Васи, затем посмотреть, какие игроки обладают пингом меньшим, чем у Васи, и вот этих игроков нужно дополнительно "откатить во времени" на разницу в пинге с Васей. Общая формула, соответственно ХСР=Пинг В + (Пинг В - Пинг А). Вот этого второго слагаемого в коде рыб нет. Игроков, у которых пинг БОЛЬШЕ Васиного откатывать дополнительно не нужно - Васины действия придут серверу раньше в любом случае(пункт второй выводов).
#5
Posted 29 May 2014 - 06:17 AM
DuoAngel, on 29 May 2014 - 05:39 AM, said:
Мне казалось что у сервера есть "своя собственная картина мира", и когда вступает в действие HSR, он просто смотрит на то, что происходило в момент выстрела, делая вывод о том, было ли попадание, или нет. Видимо всё не так, и логи лежат в клиентах, а сервер их просто сравнивает между собой. Только вот во времени сравнения ошибается из-за разного пинга.
#6
Posted 29 May 2014 - 06:32 AM
Bulef, on 29 May 2014 - 06:17 AM, said:
Из "логов" у клиентов есть только пинг на самом деле. ХСР действительно задумывался работать как Вы описали: "посмотреть назад на картину в тот момент, когда был произведен выстрел". Только вот сам момент выстрела сервер отследить-то и не может - в этом вся беда. Слышали про неопределенность Гейзенберга? Если мы точно можем определить момент времени - мы не можем определить где находится частица, ее скорость и направление движения. Если мы знаем скорость и направление движения частицы, ее местоположение - мы не знаем к какому моменту времени эти данные относятся. Также и здесь, но с одним существенным отличием - ХСР можно привести в рабочее состояние
#7
Posted 29 May 2014 - 08:55 AM
DuoAngel, on 29 May 2014 - 06:32 AM, said:
Сперва посмеялся в голос, а потом немного прихватило сердце. Здесь не так, совсем не так. Вообще ничего общего.
#8
Posted 29 May 2014 - 10:25 AM
Igor Kozyrev, on 29 May 2014 - 08:55 AM, said:
Можете смеяться сколько угодно, Ваше право. Если у вас не хватает воображения понять аллегорию - тоже ваша проблема
#9
Posted 29 May 2014 - 10:51 AM
#10
Posted 29 May 2014 - 11:57 PM
Ни кто не знает, кроме разрабов, как ЭТО у них работает(может и они не знают).
#11
Posted 30 May 2014 - 12:39 AM
#12
Posted 30 May 2014 - 12:46 AM
Baltazar, on 29 May 2014 - 11:57 PM, said:
Ни кто не знает, кроме разрабов, как ЭТО у них работает(может и они не знают).
По существу я и не критикую.- объяснено понятно, проблема действительно существует. То был небольшой оффтопик, не стоит заострять внимание.
#13
Posted 30 May 2014 - 08:07 AM
Приведу пример реально происходившего боя. Обычный российский пинг - 157мс. Идет война на каустике. Наша команда побеждает 8-4. За это время 4 лайта противника не раз и не два выбегали на группу наших лайтов (на вашего покорного слугу, в том числе). После непродолжительных обменов залпами опять разбегались до своих команд.
Пришло время убивать самих лайтов. Фокус был взят на локуста (очевидно ), сам я на файрстартере с 6 медами. Разговор в ТС с моими напарниками:
"***, этот локуст неубиваемый какой-то, уже третий раз полную альфу с 6 медов по ногам словил, ноги еле желтые". Локуст, нисколько не стесняясь, в лоб атакует моего меха, я же в ТС: "Посмотрите на живых в команде противника, что-то на D начинается (рассмотреть на ходу не получается ник противника толком), сколько у него пинг?". "23мс - отвечают мне".
23 ??? против 157 ??? Расскажите мне про шансы, ага. Естественно, мой мех падает в конечном итоге (к слову сказать, локуста этого гоняло 4 меха ). Наконец наш доблестный сталкер посылает в догонку абсолютно желтому и полностью бронированному локусту пачку ЛРМ. БАМ!!! От локуста с одной плюхи остаются только две ободранные ноги...
"-Finally, that lagger died"
"You talking bout me?"
"Who else?"
"LOL! My ping was stable for the whole match, it was 23ms, LMAO".
...А то мы не догадались
Edited by DuoAngel, 30 May 2014 - 08:19 AM.
#14
Posted 30 May 2014 - 08:34 AM
Quote
Этого не будет никогда, потому что никогда не будет. Впрочем, сейчас рыбы работают как над регистрацией попаданий срм, так и попаданиями в целом. ДУмаю, это как раз затрагивает xcp.
#15
Posted 30 May 2014 - 04:16 PM
Bulef, on 29 May 2014 - 06:17 AM, said:
Забыл ответить на это, сорри
"Собственная картина" на сервере была бы возможна, если бы информация ото всех игроков поступала на сервер единовременно. А иначе серверу пришлось бы дожидаться еле ползающего Васю, задерживая всех остальных игроков, а затем отсылать общую картинку всем игрокам, опять дожидаться когда информация доползет до Васи, дождаться его реакции и так по кругу. Это привело бы к периодическим "фризам" у всех игроков, а игроков с большим пингом ненавидели бы все поголовно.
Тут сделано несколько иначе. Ведется лог Васи КОНКРЕТНО для Васи, т.е. где находится в конкретный момент Вася, что он делает, в какую сторону и чем он стреляет. ВСЕ!
Все 24 лога на сервере по ключевым кадрам уже склеиваются в единую картину и рассылаются по игрокам. Как получаются ключевые кадры? Просто. Не замечали в начале боя надпись "Connecting"? Вот это и есть начало отсчета игрока на сервере. Затем сервер посылает единовременно всем команду "Старт", и это является началом нашего "фильма", а ключевой кадр считается просто смещением времени от начала "фильма". Кстати, после команды "Старт", которая до игроков доходит по-разному (в разные моменты времени), можно наблюдать забавности. Например, что когда Ваш мех еще только проводит предстартовую подготовку мех союзника уже куда-то бежит Посмотрите на его пинг как стартанете - удивитесь
А все попадания, расчеты повреждений и прочего уже проводятся в пределах одного "кадра" и снова рассылаются по игрокам. Это сделать один раз, получив, наконец, даже информацию от этого пресловутого Васи, просто. Другое дело, что для игрока с меньшим пингом это самый Вася в ключевом кадре стоИт и тупит (точнее делает вовсе не то, что он делает в данный момент, а что-то, что он делал давным-давно... но проблемы индейцев Шерифа не волнуют ).
С этим же связаны так называемые "инста-киллы". Банально мех с малым пингом стреляет в нашего несчастного Васю, попадает (точнее, сервер решает что он попал), рассчитывает повреждения, они оказываются фатальны - и, собственно все. Вася еще даже не получил информацию о том, что он видит кого-то, что по нему обстрел производят, вообще, вокруг бабочки летают, птички щебечут, небо голубое - а к нему уже на всех парах летит пакет с криками "УМРИ В МУЧЕНИЯХ!!! ". Что бы Вася ни делал до момента выстрела и после - значения иметь не будет. Server Authority. Это будет, от этого никуда не денешься, просто привыкнуть надо
Edited by DuoAngel, 30 May 2014 - 04:18 PM.
#16
Posted 31 May 2014 - 12:18 AM
Надо будет переделать.
Edited by Bulef, 01 June 2014 - 07:21 AM.
#17
Posted 31 May 2014 - 05:55 AM
Вот эта картинка должна попроще смотреться
Сервер дает команду "Старт игры" (зеленая линия), игроки получают эту команду, отвечают "ЕСТЬ!!!", сервер от них получает ответ за время пинга А и В игроков соответственно, отматывает для игрока А его ХСР (равный пингу А) - красная линия, выставляет в абсолютной системе отсчета времени сервера точку 0 для игрока А. Аналогично с игроком В - коричневая линия. От этих нулевых точек идет непрерывный захват статистики игроков (пунктирные линии), которые затем "склеиваются" на сервере в общую картину. Точки 0-А и 0-В не совпадают на разницу в пинге игроков А и В. Фиолетовая линия показывает "времеположение" игроков в какой-то конкретный момент времени сервера (то есть тот самый склеенный фрейм). При нулевом пинге (в идеале) расстояние от точки 0 игрока до фиолетовой линии должно быть равно расстоянию от зеленой линии на сервере до фиолетовой линии (т.е. нулевая точка будет находиться на зеленой линии старта сервера).
Проще, мне кажется, трудно показать и объяснить
Edited by DuoAngel, 31 May 2014 - 07:05 AM.
#18
Posted 31 May 2014 - 05:11 PM
#20
Posted 31 May 2014 - 11:19 PM
1 user(s) are reading this topic
0 members, 1 guests, 0 anonymous users