170 похожих чатов

Здравствуйте, объясните принцип интерполяции и экстраполяции(согласование с сервером). Теоретически понимаю,

можете ближе к практике объяснить?

14 ответов

10 просмотров

Интерполяция - есть отрезок времени. В геймдеве, как правило, это время между тиками сервера, когда клиент знает начальную позицию (время предыдущего тика) и конечную позицию (время настоящего тика). Задача клиента интерполировать передвижение до получения следующего обновления информации (т. е. тика)

Dlazder- Автор вопроса
МСМК
Интерполяция - есть отрезок времени. В геймдеве, к...

Я просто начал делать онлайн игру, и, надо устранить задержку между клиентом и сервером

Задержку ты никак не устранишь, даже посадив клиентов вплотную друг к другу, но минимизировать (вплоть до того, чтобы сделать её незаметной) можно

Dlazder
Я просто начал делать онлайн игру, и, надо устрани...

Многопользовательские игры. Разработка сетевых приложений. Джошуа Глейзер, Санджай Мадхав

Dlazder- Автор вопроса
МСМК
Задержку ты никак не устранишь, даже посадив клиен...

Ну это понятно. У меня есть тик на сервере и на клиенте, и на сервере он отстает, а так как все передвижение идет на сервере (хоть у меня и идет отображение на клиенте сразу, сервер подтверждает это) из за этого возникает мерцание

Dlazder
Ну это понятно. У меня есть тик на сервере и на кл...

Тебе нужно интерполировать и на сервере, и на клиенте

Dlazder- Автор вопроса
МСМК
Тебе нужно интерполировать и на сервере, и на клие...

Как?) Можете описать алгоритм решения задачи примерный? Как это должно работать?

Dlazder
Как?) Можете описать алгоритм решения задачи приме...

Да невозможно это описать в двух словах. Есть множество нюансов: сетевые задержки, дропы пакетов и т. д. Вкратце я написал, а далее либо к умным дядечкам за деньги, либо к книгам и самостоятельному познанию

Dlazder- Автор вопроса
Dlazder
Хорошо) буду тогда искать дальше

Экстраполяция это вообще целый сложнейший блок, где множество вариантов решения, реализация которых зависит от механик твоей игры

Dlazder- Автор вопроса
Dlazder
Как?) Можете описать алгоритм решения задачи приме...

В теории это должно работать одновременно и на клиенте, и на сервере. Клиент производит вычисления (приблизительные, не обязательно прям ультраточные), сервер в это время делает то же самое (но с большей точностью, если оно тебе надо), далее есть несколько вариантов: а) клиент выполняет действия согласно результатам собственных вычислений, сервер присылает свои вычисления, это всё согласовывается и при необходимости корректируется, б) всё так же как и в а), но клиент только передаёт данные, а все корректировки производятся на сервере. Ну, там ещё много чего используется, вплоть до некоторого подобия ИИ, когда позиция точно не может быть в некоторой точке в пространстве и/или наоборот точно будет в данной точке (оптимистичные алгоритмы, оптимизации вычислений и прочее).

Dlazder
Как?) Можете описать алгоритм решения задачи приме...

Смотри, самый простой пример c перемещением игрока Без интерполяции на клиенте: С сервера каждый тик приходит новая позиция игрока, и ты просто присваиваешь на клиенте координаты игрока. В этом кейсе возникает неприятный эффект телепортации, так как координаты будут меняться на величину заметную для глаза, (сильно больше, чем при движении на клиенте) Пример кода: player.setData('x', playerDataFromServer.x); player.setData('y', playerDataFromServer.y); С интерполяцией на клиенте: Тут почти всё тоже самое, только мы не присваиваем на клиенте координаты пришедшие с сервера, а уже прибегаем к интерполяции, например к линейной. Тут мы используем текущие координаты на клиенте, новые координаты с сервера и коэффициент интерполяции Пример кода: player.setData('x', Phaser.Math.Interpolation.Linear(player.x, playerDataFromServer.x, 0.2); player.setData('y', Phaser.Math.Interpolation.Linear(player.x, playerDataFromServer.x, 0.2); В этом случае у нас уже персонаж будет передвигаться плавно, и это можно регулировать коэффициентом интерполяции. Если коэффициент будет высокий, то будет казаться что персонаж "Плавает"

Похожие вопросы

Обсуждают сегодня

Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
40
Проблема с Windows scripting control Множество объектов получают iDispatch обертки и отдаются в скрипты. При этом скрипты могут эти обертки держать живыми очень долго, наприм...
Arioch The
16
Скажите, можно ли как-то "переместить" динамический массив из одной переменной в другую? Скажем, переместить из TList<> в TArray<>. Именно переместить, а не скопировать. Если ...
Eugene Krasnikov (ᴊɪɴ x)
37
Я тут пытаюсь переработать архитектуру подсистемы памяти ядра во что-то осмысленное. Есть pmm, который создает набор range’ей(пока что только для ядра, потом для юзерспейса), ...
Evg Resh
9
комрады, че-та лыжы не едут var tmpFont: TFont; begin tmpFont:= TFont.Create; try case rgFontColor.ItemIndex of 0: tmpFont.Color:= clWindowText; 1: tmpFo...
Ed Doc
34
Вот еще криповенькая штука. uMain.pas(517,3) Warning: Case statement does not handle all possible cases И ЧО? 😂
Александр (Rouse_) Багель
20
Интересно, нет ли какого-то способа получить из dll не адрес самой метки, а адрес со смещением?
The Bird of Hermes
54
то есть у тебя там Лазарь, не делфя?
Handatros
8
М-да. Почему бы просто со stringlist не работать?
Michael Longneck
23
коллеги, а есть простой способ определить, что программу из под Delphi запускают?
Михаил
10
Карта сайта