можете ближе к практике объяснить?
Интерполяция - есть отрезок времени. В геймдеве, как правило, это время между тиками сервера, когда клиент знает начальную позицию (время предыдущего тика) и конечную позицию (время настоящего тика). Задача клиента интерполировать передвижение до получения следующего обновления информации (т. е. тика)
Я просто начал делать онлайн игру, и, надо устранить задержку между клиентом и сервером
Задержку ты никак не устранишь, даже посадив клиентов вплотную друг к другу, но минимизировать (вплоть до того, чтобы сделать её незаметной) можно
Многопользовательские игры. Разработка сетевых приложений. Джошуа Глейзер, Санджай Мадхав
Ну это понятно. У меня есть тик на сервере и на клиенте, и на сервере он отстает, а так как все передвижение идет на сервере (хоть у меня и идет отображение на клиенте сразу, сервер подтверждает это) из за этого возникает мерцание
Тебе нужно интерполировать и на сервере, и на клиенте
Как?) Можете описать алгоритм решения задачи примерный? Как это должно работать?
Да невозможно это описать в двух словах. Есть множество нюансов: сетевые задержки, дропы пакетов и т. д. Вкратце я написал, а далее либо к умным дядечкам за деньги, либо к книгам и самостоятельному познанию
Хорошо) буду тогда искать дальше
Экстраполяция это вообще целый сложнейший блок, где множество вариантов решения, реализация которых зависит от механик твоей игры
Ну, никто не говорил что будет просто)
В теории это должно работать одновременно и на клиенте, и на сервере. Клиент производит вычисления (приблизительные, не обязательно прям ультраточные), сервер в это время делает то же самое (но с большей точностью, если оно тебе надо), далее есть несколько вариантов: а) клиент выполняет действия согласно результатам собственных вычислений, сервер присылает свои вычисления, это всё согласовывается и при необходимости корректируется, б) всё так же как и в а), но клиент только передаёт данные, а все корректировки производятся на сервере. Ну, там ещё много чего используется, вплоть до некоторого подобия ИИ, когда позиция точно не может быть в некоторой точке в пространстве и/или наоборот точно будет в данной точке (оптимистичные алгоритмы, оптимизации вычислений и прочее).
Смотри, самый простой пример 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); В этом случае у нас уже персонаж будет передвигаться плавно, и это можно регулировать коэффициентом интерполяции. Если коэффициент будет высокий, то будет казаться что персонаж "Плавает"
https://www.youtube.com/watch?v=tYs2C-CuIuw&ab_channel=OleksandrTsymbaliuk
Обсуждают сегодня