![]() |
Синхронизация юнитов в стратегии
Уважаемые, у кого есть ссылки на рускоязычные материалы по данной тематике или накопленный годами опыт, не скрывайте.
Есть стратегия для двоих игроков, реализация: сервер-клиент. В зависимости от разных факторов одни и те же юниты могут на сервере и на клиенте иногда асинхронизироваться. Необходимая задача: иногда (например, при коллизии) синхронизировать юнит на клиенте с сервером. Как это реализовано сейчас - если необходимо синхронизировать юнит, с сервера передаются его параметры (x,y,z) на клиента, где при их получении юнит сразу же занимает указанную позицию. Чтобы не было асинхронизации, то же самое происходит и на сервере через время, равное пингу. Все замечательно, только есть минус - пока пакет идет от сервера к клиенту, на клиенте юнит успевает пройти определенное расстояние, и после перепозиционирования происходит эффект дергания, т.е. юнит возвращается в ту точку, которую он уже прошел (грубо говоря, на сервере происходит то же самое). Хочется этого избежать, ибо не истина это. Но тогда необходимо переделать систему синхронизации, придумать алгоритм, позволяющий каким-то образом рассчитывать местонахождение юнита на клиенте через время пинга по отношению к серверу, и посылать уже эти координаты, чтобы синхронизировать юнит без отката назад. В случае с обычным передвижением по прямой это сделать можно, но в случае с коллизиями невозможно рассчитать точно, какое расстояние пройдет юнит через время пинга, потому что коэффициент скольжения при коллизии, замедляющий передвижение, величина непостоянная и вообще неизвестен. Вобщем пока ничего толкового в голову не пришло, может есть у кого-нибудь соображения на этот счет? |
Re: Синхронизация юнитов в стратегии
иметь два уровня синхронизации с сервером
1) мягкий 2) жосткий :) при первом ты сглаживаеш путь который проходится .... ну всмысле сплайнами двигаеш юнитов второй юзается только когда юнит далеко отошол от того что хранится на сервере |
Re: Синхронизация юнитов в стратегии
Цитата:
По поводу сглаживания в первом случае. Двигать сплайнами - это двигать прямыми, насколько я понял? Не представляю пока, как двигать прямыми при коллизии двух сфер, если их соприкосновение проходит по дуге? Как вариант, при коллизии возможно поворачивать юниты в стороны и отходить по прямой, я этот вариант сейчас разрабатываю, но даже при таком подходе не совсем понятно, как синхронизировать, потому что неизвестно, через время пинга юнит повернется уже и пойдет, или будет все еще поворачиваться. Какие параметры юнита кидать на клиента для синхронизации, чтобы попасть в точку? По поводу второго тоже не понял - синхронизировать юнит, когда они сильно разнятся на сервере и на клиенте? Это мне вообще не нравится - если предположим на сервере юнит дошел до цели, использовал ее и уже обрабатывает другое задание, а на клиенте он только у этой цели, то можно так синхронизнуть, что вообще бардак получится - на сервере цель удалилась, на клиенте осталась, а юнит уже пошел по своим делам. Может я чего недопонял? |
Re: Синхронизация юнитов в стратегии
Выражаясь примитивно, все коллизии- на сервере. А клиенты без всяких коллизий двигаются по указке с сервера.
|
Re: Синхронизация юнитов в стратегии
Цитата:
|
Re: Синхронизация юнитов в стратегии
Так экстраполируй. То есть передавай клиенту не то, что на сервере сейчас, а то, что предположительно будет через время пинга. А клиент пусть не тупо ставит в полученные координаты, иначе пойдут рывки, а с умом: плавно подгоняя "то шо есть" под "то шо надо". А как там ты это сделаешь- линейной интерполяцией, аль через сплайны кубические- это уже как на душу ляжет.
Причём, заметь, (не обижайся, а вдруг не знаешь?) передавать данные можно далеко не каждый проход цикла на сервере, а только тогда, когда что-то в процессах изменяется (например юнит поменял направление движения или остановился). |
Re: Синхронизация юнитов в стратегии
Да нет, какие обиды, все мы случайные гости на этом празднике жизни :)
Данные у меня так и передаются, только при изменении процесса. Я как раз вопрос про экстраполяцию и задавал: "В случае с обычным передвижением по прямой это сделать можно, но в случае с коллизиями невозможно рассчитать точно, какое расстояние пройдет юнит через время пинга, потому что коэффициент скольжения при коллизии, замедляющий передвижение, величина непостоянная и вообще неизвестен." Т.е. я не знаю, как точно рассчитать расстояние, которое пройдет юнит, когда его сфера скользит по сфере другого юнита и замедляет передвижение. Что такое кубические сплайны, может это мне поможет? |
Re: Синхронизация юнитов в стратегии
Вообще, есть смысл те передвижения, которые игровой процесс не сильно затрагивают, оставить клиенту... Например коллизии с дружественными юнитами можно не считать вообще, а при обработке клиентом для того, чтобы один юнит не стоял на другом,уже расставлять их по воле клиента... и т.д. :)
|
Re: Синхронизация юнитов в стратегии
"Например коллизии с дружественными юнитами можно не считать вообще, а при обработке клиентом для того, чтобы один юнит не стоял на другом,уже расставлять их по воле клиента" - это будет настоящий бардак, ибо асинхронизация полнейшая.
Уважаемые, у меня все все хорошо расставляется и коллизии просто великолепны и на сервере, и на клиенте - суть вопроса не в этом! :) Вобщем все, сел свою систему синхронизации разрабатывать. |
Часовой пояс GMT +4, время: 10:47. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot