Просмотр полной версии : Как сделать синхронизацию с сервером
gloomyBrain
08.12.2009, 18:15
Всем HOLA!
Собственно, сабж...
Хочу сделать что-то типа стрелялки
По идее единственно-верная картина мира есть только у сервера. Каждый пользователь, отправляя данные (идти, стрельнуть, кинуть) посылает время исполнения этой команды, чтобы не было коллизий (типа подобрать один предмет одновременно двум игрокам).
Получается, что сервер должен хранить несколько последних состояний мира и учитывать, чья команда "подобрать" должна быть выполнена раньше?
Не могу алгоритм выстроить... =)
Буду рад любым подсказкам, заранее спасибо
bicubic_bublic
08.12.2009, 18:33
это что-то real-time или что-то пошаговое?
если real-time, то зачем "хранить несколько последних состояний мира" ?
кто раньше прислал подобрать - того и предмет.
сервер - Модель.
клиенты - Виды.
1 клиент говорит хочу взять предмет.
сервер убирает предмет и сообщает что 1 клиент его взял
2 клиент успевает сказать - хочу взять предмет.
но сервер не обрабатывает это так как предмет уже взяли. и 2 клиенту присылает что предмет достался первому)
gloomyBrain
08.12.2009, 20:54
Идею понял, но:
приходит 2 одинаковых команды: подобрать предмет
команда содержит время отправки
команда, у которой время отправки раньше, приходит после команды, у которой время отправки позже, то есть вот в таком порядке:
1) [name:X action:getItem time: 23:46]
2) [name:Y action:getItem time: 23:45]
Или проще не заморачиваться? Что раньше пришло, то и сработает?
Просто ключевой момент вот в чем:
2 игрока стреляют друг в друга одновременно.
У №1 пинг 10, у №2 пинг 20.
Если №2 стрельнет на 11 миллисекунду раньше, то он победил.
При этом если №1 стрельнет на 9 миллисекунд позже - он все равно молодец.
Состояния мира (как я полагаю) для того и нужны, чтобы понять кто где был и кто в кого попал в момент исполнения команды.
...Или все таки забить? =)
bicubic_bublic
08.12.2009, 20:58
по вашей модели у всех игроков игра будет тормозить одинаково - пришел чел с большим пингом все тормозят..
real-time он на то и риалтайм..
gloomyBrain
08.12.2009, 21:08
Почему? Просто обработка команд будет искусственно заморожена на некое время.
Сервер же не знает, пришлет кто-то еще одну команду, или нет
По идее, он просто должен получить команду, подождать 25 мс (мало ли, еще от кого придет) и выполнить, соответственно уведомив всех клиентов об этом. Кто не уложился по пингу - я не виноват=)
Но опять же, подождать 25 мс = увеличить пинг всех игроков на это время
Честно говоря, я понятия не имею как надо делать подобные системы компенсации лагов.
Хотелось бы узнать, кто и как решал подобные проблемы. Реалтайм он на то и реалтайм, согласен =)
А какой-нибудь пользователь вдруг начнет говорить, что он уже час(год?) назад как выстрелил - и будет ему вечное счастье. Вы этого хотите?
В общем случае вряд ли удастся обойти эту проблему...
На самом деле тоже интересно решение такой задачи :)
http://flasher.ru/forum/showthread.php?t=127976 вот вам небольшой холивар на заданную тему :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.