forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Синхронизация юнитов в стратегии (http://forum.boolean.name/showthread.php?t=2446)

stone_evil 19.01.2007 05:58

Синхронизация юнитов в стратегии
 
Уважаемые, у кого есть ссылки на рускоязычные материалы по данной тематике или накопленный годами опыт, не скрывайте.
Есть стратегия для двоих игроков, реализация: сервер-клиент. В зависимости от разных факторов одни и те же юниты могут на сервере и на клиенте иногда асинхронизироваться. Необходимая задача: иногда (например, при коллизии) синхронизировать юнит на клиенте с сервером.
Как это реализовано сейчас - если необходимо синхронизировать юнит, с сервера передаются его параметры (x,y,z) на клиента, где при их получении юнит сразу же занимает указанную позицию. Чтобы не было асинхронизации, то же самое происходит и на сервере через время, равное пингу. Все замечательно, только есть минус - пока пакет идет от сервера к клиенту, на клиенте юнит успевает пройти определенное расстояние, и после перепозиционирования происходит эффект дергания, т.е. юнит возвращается в ту точку, которую он уже прошел (грубо говоря, на сервере происходит то же самое). Хочется этого избежать, ибо не истина это. Но тогда необходимо переделать систему синхронизации, придумать алгоритм, позволяющий каким-то образом рассчитывать местонахождение юнита на клиенте через время пинга по отношению к серверу, и посылать уже эти координаты, чтобы синхронизировать юнит без отката назад. В случае с обычным передвижением по прямой это сделать можно, но в случае с коллизиями невозможно рассчитать точно, какое расстояние пройдет юнит через время пинга, потому что коэффициент скольжения при коллизии, замедляющий передвижение, величина непостоянная и вообще неизвестен.
Вобщем пока ничего толкового в голову не пришло, может есть у кого-нибудь соображения на этот счет?

jimon 19.01.2007 08:50

Re: Синхронизация юнитов в стратегии
 
иметь два уровня синхронизации с сервером
1) мягкий
2) жосткий :)

при первом ты сглаживаеш путь который проходится ....
ну всмысле сплайнами двигаеш юнитов

второй юзается только когда юнит далеко отошол от того что хранится на сервере

stone_evil 19.01.2007 11:18

Re: Синхронизация юнитов в стратегии
 
Цитата:

Сообщение от jimon
иметь два уровня синхронизации с сервером
1) мягкий
2) жосткий :)

при первом ты сглаживаеш путь который проходится ....
ну всмысле сплайнами двигаеш юнитов

второй юзается только когда юнит далеко отошол от того что хранится на сервере

Я не совсем понял, в чем их суть.
По поводу сглаживания в первом случае. Двигать сплайнами - это двигать прямыми, насколько я понял? Не представляю пока, как двигать прямыми при коллизии двух сфер, если их соприкосновение проходит по дуге? Как вариант, при коллизии возможно поворачивать юниты в стороны и отходить по прямой, я этот вариант сейчас разрабатываю, но даже при таком подходе не совсем понятно, как синхронизировать, потому что неизвестно, через время пинга юнит повернется уже и пойдет, или будет все еще поворачиваться. Какие параметры юнита кидать на клиента для синхронизации, чтобы попасть в точку?
По поводу второго тоже не понял - синхронизировать юнит, когда они сильно разнятся на сервере и на клиенте? Это мне вообще не нравится - если предположим на сервере юнит дошел до цели, использовал ее и уже обрабатывает другое задание, а на клиенте он только у этой цели, то можно так синхронизнуть, что вообще бардак получится - на сервере цель удалилась, на клиенте осталась, а юнит уже пошел по своим делам.
Может я чего недопонял?

Diplomat 19.01.2007 12:08

Re: Синхронизация юнитов в стратегии
 
Выражаясь примитивно, все коллизии- на сервере. А клиенты без всяких коллизий двигаются по указке с сервера.

stone_evil 19.01.2007 13:30

Re: Синхронизация юнитов в стратегии
 
Цитата:

Сообщение от Diplomat
Выражаясь примитивно, все коллизии- на сервере. А клиенты без всяких коллизий двигаются по указке с сервера.

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

Diplomat 19.01.2007 14:50

Re: Синхронизация юнитов в стратегии
 
Так экстраполируй. То есть передавай клиенту не то, что на сервере сейчас, а то, что предположительно будет через время пинга. А клиент пусть не тупо ставит в полученные координаты, иначе пойдут рывки, а с умом: плавно подгоняя "то шо есть" под "то шо надо". А как там ты это сделаешь- линейной интерполяцией, аль через сплайны кубические- это уже как на душу ляжет.
Причём, заметь, (не обижайся, а вдруг не знаешь?) передавать данные можно далеко не каждый проход цикла на сервере, а только тогда, когда что-то в процессах изменяется (например юнит поменял направление движения или остановился).

stone_evil 22.01.2007 05:30

Re: Синхронизация юнитов в стратегии
 
Да нет, какие обиды, все мы случайные гости на этом празднике жизни :)
Данные у меня так и передаются, только при изменении процесса. Я как раз вопрос про экстраполяцию и задавал: "В случае с обычным передвижением по прямой это сделать можно, но в случае с коллизиями невозможно рассчитать точно, какое расстояние пройдет юнит через время пинга, потому что коэффициент скольжения при коллизии, замедляющий передвижение, величина непостоянная и вообще неизвестен." Т.е. я не знаю, как точно рассчитать расстояние, которое пройдет юнит, когда его сфера скользит по сфере другого юнита и замедляет передвижение. Что такое кубические сплайны, может это мне поможет?

Errthou 25.01.2007 13:03

Re: Синхронизация юнитов в стратегии
 
Вообще, есть смысл те передвижения, которые игровой процесс не сильно затрагивают, оставить клиенту... Например коллизии с дружественными юнитами можно не считать вообще, а при обработке клиентом для того, чтобы один юнит не стоял на другом,уже расставлять их по воле клиента... и т.д. :)

stone_evil 25.01.2007 13:58

Re: Синхронизация юнитов в стратегии
 
"Например коллизии с дружественными юнитами можно не считать вообще, а при обработке клиентом для того, чтобы один юнит не стоял на другом,уже расставлять их по воле клиента" - это будет настоящий бардак, ибо асинхронизация полнейшая.
Уважаемые, у меня все все хорошо расставляется и коллизии просто великолепны и на сервере, и на клиенте - суть вопроса не в этом! :)
Вобщем все, сел свою систему синхронизации разрабатывать.


Часовой пояс GMT +4, время: 10:47.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot