Войти
ПрограммированиеФорумГрафика

Избегайте использования Экстрополяции при разработке мультиплеерных игр

Страницы: 1 2 Следующая »
#0
(Правка: 14:45) 14:38, 12 июня 2021
ГонкиМультиплеер | Избегайте использования Экстрополяции при разработке мультиплеерных игр

Сразу хочу подчеркнуть ,что рекомендация касается таких игр как  симуляторы  Гонок , Авиасимы , Танки  , Корабли.  Это не касается шутеров. Так вот используйте Авторитарный Сервер со следующими рекомендациями чтоб сгладить лаги:

1. Вся логика связанная с перемещением ,колизиями ,попаданиями вычисляется только на сервере.
2. При попытке входа игрока в игровую комнату. Тестируем пинг он должен быть до 200 мс - больше досвидание пацан!  Распределяйте по игровым комнатам игроков с одинаковым пингом.
3. Добавьте в игру проверку геолокации , например игрок с  Москвы должен быть зареган на московском сервере  , с Киева на киевском и так далее , чтоб не более 1000 км от севера было это улучшит пинг . Если у вас нет денег на выделенный сервер то эту схему можно раскидать по VPS или в крайнем случае рекламируйте игру в том регионе где расположен сервер. Это сильно сократит пинг.
4. Игровые состояния для плавной игры должны обновляться примерно 50 раз в секунду или новые состояния приходить раз в 20 мс . Но в реальной сети это не  будет  ,будут задержки и потерянные пакеты. Чтоб игра не шла рывками используйте Интерполяцию или глаживание. Интеполяциия  не престказывает следующее состояние ,а растягивает по времени скажем на 100 мс ,программно это выглядит примерно так

lerpVectors(this.PositionPrew, this.PositionState, alpha)  мы переходим из  предыдущего состояние в полученное  ,где alpha коффициент интерполяции от  0 до 1. То есть пока ждем следующее состояние замедленно показываем  анимацию перехода.


Тяжелые машины имееют инерцию  и то ,что нет моментальной реации вы не заметите за то очень  даже заметите  рывки при эстрополяциии ,вы никогда  на 100% точно  прескажите  состояние на сервере ,  вектора скорости  даже собственнорго  персонажа часто будут не  совпадать!  Обязательно будут потерянные пакеты не все ваши инпуты дойдут до сервера  и чем больше потеря пакетов  тем сильней будет расхождение.  Ваше направление может изменить от столкновения  с препятсвием или противником и прочее.
В таких играх даже 200 мс  задержки  в применении команды несущественно.  Ваш танк будет двигаться максимально плавно и синхронно с сервером. Более того так легче вычислять попадания ,но об этом в следующей статье.

5. Реализация экстрополяции ,пресказание ввода с последующей синхронизацией кроме ощутимых лагов  сложна в реализациии.  Если вы начинающий разработчик  то  у вас она никогда не получиться как надо .Более  того  каналы интернет линий развиваются и отличный интернет уже доступен повсеместно . И вскором времени ,даже мобильный интернет подтяниться с введением 5G.


В общем моя настоятельная рекомендация при разработке симуляторов техники никакой Эктрополяции !


#1
(Правка: 15:06) 15:04, 12 июня 2021

Нормально все с экстраполяцией для тяжёлых предметов с инерцией, типа машин, звездолетов, подлодок. Просто к экстраполируемой позиции предмет с текущей позиции нужно плавно интерполировать на клиенте. И как раз из-за того, что он тяжёлый и с инерцией - это будет не очень заметно.

#2
17:49, 12 июня 2021

Смена в пришкольном лагере закончилась?

#3
(Правка: 20:40) 20:38, 12 июня 2021

рекомендую при приёме пищи не пользоваться вилками, потому что они представляют опасность уколоться. ешьте всё только только ложкой. самый простой способ расправиться с распространённой проблемой, стейком — это поставить на тарелку анти-стейк фильтр, чтобы стейк в неё попросту нельзя было положить. добавьте на кухню также детектор мяса и просто не пускайте в неё никого, кто попробует пронести мясо.

#4
21:01, 12 июня 2021

HolyDel

Я так понимаю эктрополяцию.

1. На сервере  допустим если мы делаем гонки создается  объект  Car {Position, Quaternion} который содержит стартовую позицию ввиде вектора Vector3  и поворота корпуса ввиде кватерниона.
2.Мы получаем на клиенте стартовое положение нашей машины и жмем ASWD  .
3. Используя свой Input1  и  State0  мы вычисляем  следующую позицию  которую мы сразу же используем для перемещения  своей машины.
4.На сервер отправляется  Input1 ,а мы сохраняем на клиенте исторрию ввиде let Prediction =  Map (IdCommand , State{Quaternion,Vector3}, Input{ASWD} )
5. Все это время равное  примерно Ping/2 , объект нашего авто  стоит на месте  пока до него не долетит Input1 . До этого момента происходит синхронизация . Это как бы Точка Синхронизации

6. Далле если за  Input1  сразу присылается  Input2.  Мы применяем изменение направления на сервере  .Но так как Input будут приходить  далеко не каждый тик сервера ,так мы отправляем их только если меняем направление движения авто.То сервер  продолжает двигать авто по старой траектори каждый тик .

7.  Таки образом  сервер когда отправлят  состояния  трубующие синхзронизации прикрепляет к ним
IdCommand  , а те которые не требуют сихронизации ,продолжение движения старой траектори метим 0.
8. Когда приходит ответ севрера мы сопоставляем  State1 c  Prediction1 .  Если все норм продолжаем движение ,если нет  то используя  хранилище  Prediction  применяем  к  State1  все Input  которые есть до  InputN  ,получаем новое  предсказание . PredictionN.

9.  PredictionN мы сразу применяем ,а устаревшие  Prediction удаляются из историии.

#5
11:47, 13 июня 2021

Suslik  Я так скажу я не одной игры в которой это эстрополяция хорошо работала не видел ,сплошная рассинхронизация. И те кто тут смеются не разу в жизни ее не реализовывали.

#6
12:12, 13 июня 2021

Абсолютли. Все тупые и ничего не умеют, один ты умный и вник в суть вещей.

#7
13:33, 13 июня 2021

vladtepesh1488
> Я так скажу я не одной игры в которой это эстрополяция хорошо работала не видел
> ,сплошная рассинхронизация. И те кто тут смеются не разу в жизни ее не
> реализовывали.
Очевидно же, что если экстраполяция хорошая, то ты её и не должен видеть.

#8
13:58, 13 июня 2021

vladtepesh1488
> Я так понимаю эктрополяцию.

Эктополлюцию ты изучил почти так же хорошо, как русский язык.

#9
16:02, 13 июня 2021

jaguard
Слушай любитель.... Я могу допустить опечатку ,а если хочешь разводить мусор вали в другую тему. Мы тут обсуждаем технический вопрос не флуди!

#10
17:20, 13 июня 2021

А это самое, можно список проектов на которых вы реализовали заявленные принципы?

#11
(Правка: 23:54) 23:53, 13 июня 2021

vladtepesh1488
А ты сам-то какие игры зашипил?

#12
13:43, 14 июня 2021

Delfigamer
> А ты сам-то какие игры зашпилил?
fixed

#13
14:00, 14 июня 2021

vladtepesh1488
> Я так понимаю эктрополяцию.
ничерта ты не понимаешь...

#14
16:08, 15 июня 2021

>Избегайте использования Экстрополяции при разработке мультиплеерных игр
Хорошо

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика