Jump to content

[Redacted]? Или Hsr По-Рыбьи


63 replies to this topic

#1 MechWarrior849305

    Member

  • PipPipPipPipPipPipPipPipPip
  • Ace Of Spades
  • Ace Of Spades
  • 3,024 posts

Posted 28 May 2014 - 09:19 AM

Posted Image

Ну, или что такое "Лаг-шилд" (lag-shield) наглядно.

Все мы прекрасно знаем, что в игре есть такая замечательная фича как HSR (Host State Rewind - "серверная перемотка"). Эта такая приблуда, которая позволяет игрокам с большим пингом стрелять в мехов противника туда, где они видят их на экране своих мониторов, а не в пустое пространство перед ними, угадывая их реальное местоположение. Также мы прекрасно осведомлены о том, что этот самый ХСР не работает - это хорошо заметно при стрельбе при пинге 150+ по лайтам с пингом меньше 100. Лазеры не режут, СРМ-ки не дамажат. При попытке стрелять СРМками при собственном пинге 200+ можно в упор промахиваться по атласу с пингом 50... Рыбы честно признались, что не в курсе как порешать проблему с нерабочим кодом. Ответ лежит на поверхности, игроками уже несколько раз указывалось на косяк в принципе действия перемотки... Только вот рыбы не общаются с комьюнити. ВООБЩЕ. Так что надежд на фикс данной багофичи нет - сами они вряд ли смогут догадаться :ph34r:

Остается нести доброе-светлое-вечное в массы, просвещать новичков так сказать.

Как работает эта штука. Смотрим на картинку.

У нас есть игрок А и игрок В, которые перемещаются в пространстве-времени. Информация об их местоположении, скорости, действиях и т.п. приходит на сервер с запозданием, соответственно, для игрока А - с пингом А, и для игрока В - с пингом В.
Для простоты рассматриваемой картины принято, что пинг игрока В больше пинга игрока А, и игрок В стреляет мгновенно попадающим оружием (лазерами, к примеру).
Между двумя фиолетовыми линиями в центре показано как сервер воспринимает положение игроков с течением времени, выше показано РЕАЛЬНОЕ положение игрока А, ниже - РЕАЛЬНОЕ положение игрока В.

Так вот, эти два игрока бегают-прыгают, занимаются своими делами, и, наконец, находят друг друга (пусть это будет кольцо на Терме - самая часто выпадающая карта все-таки :) ). Момент встречи обзовем "точкой отсчета", "zero-point", "0-point" или как угодно. На рисунке отмечено зелененькими кружками на стороне сервера. Игроки еще не в курсе, что они видят друг друга, потому что информация, идущая от сервера на их компьютеры, запаздывает (на пинг А и В).

Ну а теперь самое интересное. Информация от сервера идет к игроку В за время его пинга (показано синей стрелкой). За это время игрок А перемещается в РЕАЛЬНОМ пространстве до позиции, показанной фиолетовым пунктиром, но, опять же, информация о местоположении игрока А немного запаздывает, и сервер "думает", что игрок А находится на пару метров позади своего реального местоположения (фиолетовый пунктирный кружочек на линии сервера).

Информация дошла до игрока В. Все! ЗАЛП!!! Все лазеры ушли в цель!!! (напоминаю, игрок В видит картину, показанную зеленым!).
Информация о выстреле побежала обратно до сервера (вертикальная фиолетовая стрелка). За это время игрок А переместится еще дальше от первоначального местоположения (от "точки отсчета"). Теперь он находится в точке 1 ("1-point" как я ее на картинке обозвал). Выстрел игрока доходит до сервера в также в точке "1", только эта точка "1" для игрока В немножко другая :ph34r: (показано на рисунке связанными стрелочками).

Включается рыбья приблуда ХСР, которая "перематывает назад" время на сервере, равное пингу игрока В. Что из этого выходит - показано на рисунке желтым цветом. FAIL :ph34r: Почему так? Потому что пираньи не учли в коде перемотки РАЗНИЦУ в пингах игрока А и В.

Из этого вытекают следующие выводы:
1) Важен не абсолютный пинг игрока, а конкретная разница между Вами и вашим виртуальным врагом. Игрок с пингом 50 мс будет лагать для игрока с пингом 100 мс ровно так же, как и последний будет лагать для игрока с пингом 150 мс.
2) Игрок А находится в абсолютном шоколаде - он видит игрока В в том месте, где его уже давно нет, и при этом игрок В получит 100% повреждений все равно.
3) Игроку В нет смысла "крутить торсом" когда он видит вспышки лазеров - он УЖЕ получил 100% повреждений. Поэтому - сначала отворачиваем фэйс, а уже потом, после выстрела противника, поворачиваемся сами и стреляем. Ну и снова отворачиваемся ДО! выстрела игрока А.
4) Игроки с равным пингом находятся в равных условиях (даже если оба играют какой-нибудь Папуа-Новой Гвинеи с пингом больше 10 секунд) - противник на сервере для них находится ровно в том месте где они его видят.

Ну а пираньям... ХСР должен работать по принципу: для каждого из 24 игроков в команде сервер должен 23 раза перематывать назад фреймы соответственно пингу каждого из оставшихся 23 игроков, играющих вместе с ним.


Многа букаф, сам ниасилил ;) Если у кого есть желание - можете перевести на английский, ну или даже разрабам ссылку кинуть - они все равно забьют :ph34r:

#2 Evengar Dragonis

    Member

  • PipPipPipPipPipPipPipPipPip
  • 3,070 posts

Posted 28 May 2014 - 11:53 PM

Неплохо, но материал следует сделать более легкоусваиваемым, а картинку нарезать по времени, а то каша получилась. Лайт-вариант вполне можно переводить.

#3 Bulef

    Member

  • PipPipPipPipPipPipPip
  • 531 posts

Posted 29 May 2014 - 12:55 AM

Я так понял, что вся проблема в том, что при выстреле игрока В, проходит слишком много времени до того как сервер получит команду для анализа позиций на определённый момент времени и при непосредственном анализе позиций с учётом перемотки на сервере, позиции совпадать не будут, так как для игрока А эта позиция совпадала бы с моментом раньше, чем для игрока В.

Вкратце нужно просто делать поправку на учёт задержки игрока В при получении сервером команды на анализ позиций, чтобы позиции на сервере совпадали. Тогда HSR заработает? Я правильно понял?

#4 MechWarrior849305

    Member

  • PipPipPipPipPipPipPipPipPip
  • Ace Of Spades
  • Ace Of Spades
  • 3,024 posts

Posted 29 May 2014 - 05:39 AM

View PostLeonid, on 28 May 2014 - 11:53 PM, said:

Неплохо, но материал следует сделать более легкоусваиваемым, а картинку нарезать по времени, а то каша получилась. Лайт-вариант вполне можно переводить.

"Клиент-серверную" архитектуру на плоской картинке изобразить, не прибегая к использованию 3-4-5 координатных осей, ну ООООЧЕНЬ сложно :) Поэтому такая каша получается.

View PostBulef, on 29 May 2014 - 12:55 AM, said:

Я так понял, что вся проблема в том, что при выстреле игрока В, проходит слишком много времени до того как сервер получит команду для анализа позиций на определённый момент времени и при непосредственном анализе позиций с учётом перемотки на сервере, позиции совпадать не будут, так как для игрока А эта позиция совпадала бы с моментом раньше, чем для игрока В.

Именно. Можно это представить в виде нескольких режиссеров, которые решили снимать фильм по одному сценарию. Каждый режиссер снял бы этот фильм по-своему, и ключевые кадры у них в чем-то, пусть в мелочах, но различались бы.
Если представить совокупность расположений всех игроков на сервере в какой-либо конкретный момент как единый "кадр" (фрейм), то эти "кадры" в разных фильмах выглядят по-разному, начиная от начальных титров и заканчивая "The End"ом.

View PostBulef, on 29 May 2014 - 12:55 AM, said:

Вкратце нужно просто делать поправку на учёт задержки игрока В при получении сервером команды на анализ позиций, чтобы позиции на сервере совпадали. Тогда HSR заработает? Я правильно понял?


Не совсем так. См. пункт первый выводов. Важен не абсолютный пинг игрока, а конкретная разница в пингах игрока А и В. То есть, в игре участвуют 24 динамических объектов - 24 меха игроков. При работе ХСР для конкретного Васи (Коли, Пети...) сервер сначала должен отмотать "фреймы" назад на величину пинга этого Васи, затем посмотреть, какие игроки обладают пингом меньшим, чем у Васи, и вот этих игроков нужно дополнительно "откатить во времени" на разницу в пинге с Васей. Общая формула, соответственно ХСР=Пинг В + (Пинг В - Пинг А). Вот этого второго слагаемого в коде рыб нет. Игроков, у которых пинг БОЛЬШЕ Васиного откатывать дополнительно не нужно - Васины действия придут серверу раньше в любом случае(пункт второй выводов).

#5 Bulef

    Member

  • PipPipPipPipPipPipPip
  • 531 posts

Posted 29 May 2014 - 06:17 AM

View PostDuoAngel, on 29 May 2014 - 05:39 AM, said:

Не совсем так. См. пункт первый выводов. Важен не абсолютный пинг игрока, а конкретная разница в пингах игрока А и В. То есть, в игре участвуют 24 динамических объектов - 24 меха игроков. При работе ХСР для конкретного Васи (Коли, Пети...) сервер сначала должен отмотать "фреймы" назад на величину пинга этого Васи, затем посмотреть, какие игроки обладают пингом меньшим, чем у Васи, и вот этих игроков нужно дополнительно "откатить во времени" на разницу в пинге с Васей. Общая формула, соответственно ХСР=Пинг В + (Пинг В - Пинг А). Вот этого второго слагаемого в коде рыб нет. Игроков, у которых пинг БОЛЬШЕ Васиного откатывать дополнительно не нужно - Васины действия придут серверу раньше в любом случае(пункт второй выводов).

Мне казалось что у сервера есть "своя собственная картина мира", и когда вступает в действие HSR, он просто смотрит на то, что происходило в момент выстрела, делая вывод о том, было ли попадание, или нет. Видимо всё не так, и логи лежат в клиентах, а сервер их просто сравнивает между собой. Только вот во времени сравнения ошибается из-за разного пинга.

#6 MechWarrior849305

    Member

  • PipPipPipPipPipPipPipPipPip
  • Ace Of Spades
  • Ace Of Spades
  • 3,024 posts

Posted 29 May 2014 - 06:32 AM

View PostBulef, on 29 May 2014 - 06:17 AM, said:

Мне казалось что у сервера есть "своя собственная картина мира", и когда вступает в действие HSR, он просто смотрит на то, что происходило в момент выстрела, делая вывод о том, было ли попадание, или нет. Видимо всё не так, и логи лежат в клиентах, а сервер их просто сравнивает между собой. Только вот во времени сравнения ошибается из-за разного пинга.

Из "логов" у клиентов есть только пинг на самом деле. ХСР действительно задумывался работать как Вы описали: "посмотреть назад на картину в тот момент, когда был произведен выстрел". Только вот сам момент выстрела сервер отследить-то и не может - в этом вся беда. Слышали про неопределенность Гейзенберга? Если мы точно можем определить момент времени - мы не можем определить где находится частица, ее скорость и направление движения. Если мы знаем скорость и направление движения частицы, ее местоположение - мы не знаем к какому моменту времени эти данные относятся. Также и здесь, но с одним существенным отличием - ХСР можно привести в рабочее состояние :)

#7 Igor Kozyrev

    Member

  • PipPipPipPipPipPipPipPip
  • WC 2017 Silver Champ
  • WC 2017 Silver Champ
  • 1,881 posts
  • Twitch: Link
  • LocationRussia, Siberia

Posted 29 May 2014 - 08:55 AM

View PostDuoAngel, on 29 May 2014 - 06:32 AM, said:

Слышали про неопределенность Гейзенберга? Если мы точно можем определить момент времени - мы не можем определить где находится частица, ее скорость и направление движения. Если мы знаем скорость и направление движения частицы, ее местоположение - мы не знаем к какому моменту времени эти данные относятся. Также и здесь, но с одним существенным отличием - ХСР можно привести в рабочее состояние :)

Сперва посмеялся в голос, а потом немного прихватило сердце. Здесь не так, совсем не так. Вообще ничего общего.

#8 MechWarrior849305

    Member

  • PipPipPipPipPipPipPipPipPip
  • Ace Of Spades
  • Ace Of Spades
  • 3,024 posts

Posted 29 May 2014 - 10:25 AM

View PostIgor Kozyrev, on 29 May 2014 - 08:55 AM, said:

Сперва посмеялся в голос, а потом немного прихватило сердце. Здесь не так, совсем не так. Вообще ничего общего.

Можете смеяться сколько угодно, Ваше право. Если у вас не хватает воображения понять аллегорию - тоже ваша проблема :ph34r:

#9 Igor Kozyrev

    Member

  • PipPipPipPipPipPipPipPip
  • WC 2017 Silver Champ
  • WC 2017 Silver Champ
  • 1,881 posts
  • Twitch: Link
  • LocationRussia, Siberia

Posted 29 May 2014 - 10:51 AM

У меня хватает представления о принципе неопределенности, чтобы понять, что эта аллегория не работает :ph34r:

#10 Baltazar

    Member

  • PipPipPipPipPipPip
  • Overlord
  • Overlord
  • 252 posts
  • LocationNovosibirsk

Posted 29 May 2014 - 11:57 PM

Игорь, лучше обосновывать свои слова в диалоге, а не крикнуть в дверь и захлопнуть ее.

Ни кто не знает, кроме разрабов, как ЭТО у них работает(может и они не знают).

#11 Oponeks

    Member

  • PipPipPip
  • The Undertaker
  • The Undertaker
  • 62 posts
  • LocationRussia, S.-Pb.

Posted 30 May 2014 - 12:39 AM

Теперь понятно, почему просматривая финальную статистику иногда глаза на лоб - насколько не соответствуют цифры на экране с реальным ощущением (справедливости ради скажу, что отклонения бывают чудовищны как в одну сторону, так и в другую). Ларчик просто открывался - ping мой/соперника. Кстати мой стабилен 150-160. По VisualRoute океан пересекает всегда не более 40ms, а в te8-3-10G Broomfield, CO, USA скачок до 150ms стабильно идёт. Ладно, хоть ясность есть....

#12 Igor Kozyrev

    Member

  • PipPipPipPipPipPipPipPip
  • WC 2017 Silver Champ
  • WC 2017 Silver Champ
  • 1,881 posts
  • Twitch: Link
  • LocationRussia, Siberia

Posted 30 May 2014 - 12:46 AM

View PostBaltazar, on 29 May 2014 - 11:57 PM, said:

Игорь, лучше обосновывать свои слова в диалоге, а не крикнуть в дверь и захлопнуть ее.

Ни кто не знает, кроме разрабов, как ЭТО у них работает(может и они не знают).

По существу я и не критикую.- объяснено понятно, проблема действительно существует. То был небольшой оффтопик, не стоит заострять внимание.

#13 MechWarrior849305

    Member

  • PipPipPipPipPipPipPipPipPip
  • Ace Of Spades
  • Ace Of Spades
  • 3,024 posts

Posted 30 May 2014 - 08:07 AM

Именно поэтому для меня единственной желанной "фичей" игры было бы, пусть и не исправление ХСР (это в идеале), а информация о пинге противника, ЖЕСТКО закрепленная прям над его мехом. Обычно же, после второго-третьего "промаха", когда в мою голову закрадываются сомнения, действия выглядят так: Лок цели (по R) - самое забавное с мехами под ЕСМ -> посмотреть ник игрока -> открыть таблицу и посмотреть пинг этого игрока в команде противника (ну или, как вариант, попросить своих тиммейтов посмотреть, так как в бою на лайтах все эти действия на ходу выполнить... назовем это термином "СЛОЖНО" ^_^ ).
Приведу пример реально происходившего боя. Обычный российский пинг - 157мс. Идет война на каустике. Наша команда побеждает 8-4. За это время 4 лайта противника не раз и не два выбегали на группу наших лайтов (на вашего покорного слугу, в том числе). После непродолжительных обменов залпами опять разбегались до своих команд.
Пришло время убивать самих лайтов. Фокус был взят на локуста (очевидно :unsure: ), сам я на файрстартере с 6 медами. Разговор в ТС с моими напарниками:
"***, этот локуст неубиваемый какой-то, уже третий раз полную альфу с 6 медов по ногам словил, ноги еле желтые". Локуст, нисколько не стесняясь, в лоб атакует моего меха, я же в ТС: "Посмотрите на живых в команде противника, что-то на D начинается (рассмотреть на ходу не получается ник противника толком), сколько у него пинг?". "23мс - отвечают мне".
23 ??? против 157 ??? Расскажите мне про шансы, ага. Естественно, мой мех падает в конечном итоге (к слову сказать, локуста этого гоняло 4 меха :D ). Наконец наш доблестный сталкер посылает в догонку абсолютно желтому и полностью бронированному локусту пачку ЛРМ. БАМ!!! От локуста с одной плюхи остаются только две ободранные ноги...

"-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 Igor Kozyrev

    Member

  • PipPipPipPipPipPipPipPip
  • WC 2017 Silver Champ
  • WC 2017 Silver Champ
  • 1,881 posts
  • Twitch: Link
  • LocationRussia, Siberia

Posted 30 May 2014 - 08:34 AM

Quote

информация о пинге противника, ЖЕСТКО закрепленная прям над его мехом

Этого не будет никогда, потому что никогда не будет. Впрочем, сейчас рыбы работают как над регистрацией попаданий срм, так и попаданиями в целом. ДУмаю, это как раз затрагивает xcp.

#15 MechWarrior849305

    Member

  • PipPipPipPipPipPipPipPipPip
  • Ace Of Spades
  • Ace Of Spades
  • 3,024 posts

Posted 30 May 2014 - 04:16 PM

View PostBulef, on 29 May 2014 - 06:17 AM, said:

Мне казалось что у сервера есть "своя собственная картина мира", и когда вступает в действие HSR, он просто смотрит на то, что происходило в момент выстрела


Забыл ответить на это, сорри :lol:

"Собственная картина" на сервере была бы возможна, если бы информация ото всех игроков поступала на сервер единовременно. А иначе серверу пришлось бы дожидаться еле ползающего Васю, задерживая всех остальных игроков, а затем отсылать общую картинку всем игрокам, опять дожидаться когда информация доползет до Васи, дождаться его реакции и так по кругу. Это привело бы к периодическим "фризам" у всех игроков, а игроков с большим пингом ненавидели бы все поголовно.
Тут сделано несколько иначе. Ведется лог Васи КОНКРЕТНО для Васи, т.е. где находится в конкретный момент Вася, что он делает, в какую сторону и чем он стреляет. ВСЕ!
Все 24 лога на сервере по ключевым кадрам уже склеиваются в единую картину и рассылаются по игрокам. Как получаются ключевые кадры? Просто. Не замечали в начале боя надпись "Connecting"? Вот это и есть начало отсчета игрока на сервере. Затем сервер посылает единовременно всем команду "Старт", и это является началом нашего "фильма", а ключевой кадр считается просто смещением времени от начала "фильма". Кстати, после команды "Старт", которая до игроков доходит по-разному (в разные моменты времени), можно наблюдать забавности. Например, что когда Ваш мех еще только проводит предстартовую подготовку мех союзника уже куда-то бежит ^_^ Посмотрите на его пинг как стартанете - удивитесь :D

А все попадания, расчеты повреждений и прочего уже проводятся в пределах одного "кадра" и снова рассылаются по игрокам. Это сделать один раз, получив, наконец, даже информацию от этого пресловутого Васи, просто. Другое дело, что для игрока с меньшим пингом это самый Вася в ключевом кадре стоИт и тупит (точнее делает вовсе не то, что он делает в данный момент, а что-то, что он делал давным-давно... но проблемы индейцев Шерифа не волнуют B) ).

С этим же связаны так называемые "инста-киллы". Банально мех с малым пингом стреляет в нашего несчастного Васю, попадает (точнее, сервер решает что он попал), рассчитывает повреждения, они оказываются фатальны - и, собственно все. Вася еще даже не получил информацию о том, что он видит кого-то, что по нему обстрел производят, вообще, вокруг бабочки летают, птички щебечут, небо голубое - а к нему уже на всех парах летит пакет с криками "УМРИ В МУЧЕНИЯХ!!! :lol: ". Что бы Вася ни делал до момента выстрела и после - значения иметь не будет. Server Authority. Это будет, от этого никуда не денешься, просто привыкнуть надо ;)

Edited by DuoAngel, 30 May 2014 - 04:18 PM.


#16 Bulef

    Member

  • PipPipPipPipPipPipPip
  • 531 posts

Posted 31 May 2014 - 12:18 AM

Сделал схемы для англоязычной ветки. Суть вопроса в девяти последних схемах. Есть проблемы с отображением изображений?

Надо будет переделать.

Edited by Bulef, 01 June 2014 - 07:21 AM.


#17 MechWarrior849305

    Member

  • PipPipPipPipPipPipPipPipPip
  • Ace Of Spades
  • Ace Of Spades
  • 3,024 posts

Posted 31 May 2014 - 05:55 AM

Когда я говорил о сложности отображения клиент-серверной архитектуры на картинке - не кривил душой абсолютно :)Суть ясна, но легче на картинках усваиваться не стала без конкретных пояснений по каждой картинке.

Вот эта картинка должна попроще смотреться

Posted Image
Сервер дает команду "Старт игры" (зеленая линия), игроки получают эту команду, отвечают "ЕСТЬ!!!", сервер от них получает ответ за время пинга А и В игроков соответственно, отматывает для игрока А его ХСР (равный пингу А) - красная линия, выставляет в абсолютной системе отсчета времени сервера точку 0 для игрока А. Аналогично с игроком В - коричневая линия. От этих нулевых точек идет непрерывный захват статистики игроков (пунктирные линии), которые затем "склеиваются" на сервере в общую картину. Точки 0-А и 0-В не совпадают на разницу в пинге игроков А и В. Фиолетовая линия показывает "времеположение" игроков в какой-то конкретный момент времени сервера (то есть тот самый склеенный фрейм). При нулевом пинге (в идеале) расстояние от точки 0 игрока до фиолетовой линии должно быть равно расстоянию от зеленой линии на сервере до фиолетовой линии (т.е. нулевая точка будет находиться на зеленой линии старта сервера).


Проще, мне кажется, трудно показать и объяснить :ph34r:

Edited by DuoAngel, 31 May 2014 - 07:05 AM.


#18 MartialArt

    Member

  • Pip
  • 15 posts

Posted 31 May 2014 - 05:11 PM

Хм, почитал я эту тему и не помимаю, а как я со своим пингом в 250 ms играя с людьми у которых пинг 40-100, вообще убиваю их. Причем, вы не поверите лайтов я тоже убиваю.

#19 Varhait

    Archivarius

  • PipPipPipPipPipPipPipPipPipPip
  • Overlord
  • Overlord
  • 9,698 posts

Posted 31 May 2014 - 09:48 PM

View PostChuzhoi, on 31 May 2014 - 05:11 PM, said:

Хм, почитал я эту тему и не помимаю, а как я со своим пингом в 250 ms играя с людьми у которых пинг 40-100, вообще убиваю их. Причем, вы не поверите лайтов я тоже убиваю.

Спроси у Krizalius'а у него пинг 900.

#20 MartialArt

    Member

  • Pip
  • 15 posts

Posted 31 May 2014 - 11:19 PM

Значит не все так плохо. А возможно ли перенести регистрацию повреждений с сервера на клиентов?





1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users