Интерполяция / экстрополяция
Возникла небольшая необходимость адекватно понять как сделать интерпляцию или экстраполяцию.
Для примера мой проект: http://playcanv.as/p/N9yAibo7 :rolleyes: В нем заметен забавные эффекты шара из-за интерполяции и пинга, так не должно быть (скругленные углы, недолеты до объектов, развороты). Жду совета что лучше использовать и какими методами. PS. На текущий момент дела так : 1. Вычисляю направление по 2 точкам (старому положению и тому, которое пришло с сервера) 2. Двигаю по этому вектору средствами клиента со скоростью, полученной с сервера. |
Ответ: Интерполяция / экстрополяция
На текущий момент ты делаешь интерполяцию.
Учитывая что поведение шарика легко предсказать, то экстраполяцию не сложно будет сделать, ошибки в предсказании будут - и их не избежать. Предсказывать нужно шарики и платформы тоже. Предсказывать нужно в будущее на отрезок времени равный половине твоего latency (половине round-trip'а). Применять свой ввод можно сразу. Если применяешь сразу, то сервер должен будет в будущем учитывать то что сообщение идет от клиента с задержкой, следственно нужно будет немного "играть со временем", а именно если от клиента пришло сообщение что он двигается влево, то значит он уже двигается какое-то время, и нужно это время учесть, двинуть платформу чуток дальше. Но учитывать что он может резко остановиться тоже. Например если задержка у игрока 200мс, и он начал двигаться, но резко остановился через 100мс, то сервер должен двинуть платформу по приходу первого сообщения о движении в направлении куда она двигается, но потом когда получит второе сообщение, от части отменить часть движения. В общем это не просто. Для этого обычно делают так: игра на сервере сохраняет состояние вещей каждый тик, затем когда приходят сообщение, идешь в прошлое на актуальный тик во время которого клиент сделал решение, и начинаешь применять его действия от туда до настоящего. Все естественно шлешь только настоящее состояние. Клиенты все предсказывают на будущее на продолжительность своей задержки. Задача сделать так чтобы клиенты и сервер не зависимо от их задержек видели идентичное состояние мира за счет предсказывания. Симулировать задержку очень легко, создав таймаут в обработчики сообщений на клиенте. Для улучшения качества предсказания, клиенты могут симулировать игру (коллизию) по таким же правилам как и сервер, таким образом будет проще получить хорошее состояние игры на клиентах. |
Часовой пояс GMT +4, время: 16:26. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot