Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как сделать синхронизацию с сервером (http://www.flasher.ru/forum/showthread.php?t=133592)

gloomyBrain 08.12.2009 18:15

Как сделать синхронизацию с сервером
 
Всем HOLA!
Собственно, сабж...

Хочу сделать что-то типа стрелялки
По идее единственно-верная картина мира есть только у сервера. Каждый пользователь, отправляя данные (идти, стрельнуть, кинуть) посылает время исполнения этой команды, чтобы не было коллизий (типа подобрать один предмет одновременно двум игрокам).
Получается, что сервер должен хранить несколько последних состояний мира и учитывать, чья команда "подобрать" должна быть выполнена раньше?
Не могу алгоритм выстроить... =)

Буду рад любым подсказкам, заранее спасибо

bicubic_bublic 08.12.2009 18:33

это что-то real-time или что-то пошаговое?
если real-time, то зачем "хранить несколько последних состояний мира" ?
кто раньше прислал подобрать - того и предмет.

Котяра 08.12.2009 19:42

сервер - Модель.
клиенты - Виды.
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 мс = увеличить пинг всех игроков на это время

Честно говоря, я понятия не имею как надо делать подобные системы компенсации лагов.

Хотелось бы узнать, кто и как решал подобные проблемы. Реалтайм он на то и реалтайм, согласен =)

incoob 11.12.2009 00:45

А какой-нибудь пользователь вдруг начнет говорить, что он уже час(год?) назад как выстрелил - и будет ему вечное счастье. Вы этого хотите?
В общем случае вряд ли удастся обойти эту проблему...

На самом деле тоже интересно решение такой задачи :)

Gaen 11.12.2009 01:23

http://flasher.ru/forum/showthread.php?t=127976 вот вам небольшой холивар на заданную тему :)


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

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.