Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.07.2009, 13:36
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 1  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Arrow Многопользовательская игра реального времени - нужен совет

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

Пока думаю обмениваться сообщениями о нажатии и отпускании клавиш:
1. юзер нажимает кнопку (например газ), его корабль начинает газовать
2. на сервер уходит сообщение о том, что юзер включил газ, плюс его текущие координаты плюс локальный таймстамп (зная разницу во времени с сервером, можно вычислить время нажатия по серверным часам)
3. сервер запоминает что этот кораблик включил газ, шлет подтверждение и рассылает остальным клиентам сообщение о том что этот корабль включил газ (плюс координаты, таймстамп, все дела)
4а. клиент получает подтверждение, все ок, процесс продолжается
4b. клиент не получает подтверждение... тогда получается что юзер будет видеть газующий кораблик, пока клиент не получит новую порцию данных с сервера, в том числе о своих координатах и скорости, и тогда для юзера его кораблик встанет на реальное место и перестанет газовать. Чтобы включить газ, нужно будет отпустить кнопку газа и нажать снова.

Насчет отпускания - алгоритм тот же.

Какие плюсы и минусы у такого подхода? Какие ещё могут быть варианты? Что можно почитать по теме? (Статью Касперски читал, там несколько не то, это скорее обзорная статья по способам организации сети)
__________________
тонкий тролль, осеянный благодатью

Старый 27.07.2009, 13:42
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 2  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
1. зачем он начинает газовать?
2. зачем отправляется что-то кроме вектора направления?
4b. этот пункт лишний.

Старый 27.07.2009, 13:45
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 3  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
искать по словам:
Dead Reckoning
Latency Hiding for Networked Games
lag compensation
latency compensation

собственно во отличная статья на тему http://www.gamasutra.com/features/19...aronson_01.htm

Замечу так же, что для первой простенькой игрушки можно не заморачиваться и просто передавать вектор или перемещение. Иначе можно запутаться, нагрузить кодом и впасть в прострацию =)


Последний раз редактировалось iflamberg; 27.07.2009 в 13:52.
Старый 27.07.2009, 15:19
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 4  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Спасибо за ответы.

BlooDHounD

Цитата:
1. зачем он начинает газовать?
Чтобы сдвинуться с места

Цитата:
2. зачем отправляется что-то кроме вектора направления?
Пытаюсь найти способ не гонять лишних данных. Хотя если народу будет много, события нажатия/отпускания будут происходить чаще, чем игровые тики. Мысль ясна.

Цитата:
4b. этот пункт лишний.
Ок, если слать только вектора, думаю подтверждения станут не нужны.

iflamberg, спасибо за наводки
__________________
тонкий тролль, осеянный благодатью


Последний раз редактировалось Gaen; 27.07.2009 в 15:25.
Старый 27.07.2009, 15:22
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 5  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
1. что бы сдвинуть с места ждите 4a
2. при это собираетесь слать кучу фигни, которая и так должна быть на сервере?

Старый 27.07.2009, 16:21
AlexStukoff вне форума Посмотреть профиль Отправить личное сообщение для AlexStukoff Посетить домашнюю страницу AlexStukoff Найти все сообщения от AlexStukoff
  № 6  
Ответить с цитированием
AlexStukoff
 
Аватар для AlexStukoff

Регистрация: Dec 2007
Адрес: Stavropol
Сообщений: 65
Отправить сообщение для AlexStukoff с помощью ICQ
Координаты, вектор направления, скорость корабликов хранятся только на сервере!
Сервер принимает:
- нажатие влево/вправо (один бит)
- нажатие/отпускание газа (еще один бит)
Сервер отдает:
- только изменившиеся с последнего вызова координаты и вектора направлений корабликов.

всё. остальное. на. сервере.

в итоге программная часть клиента сведется к 100 строкам кода

P.S.: почему нельзя отправлять на сервер текущие координаты (например). потому что тогда возможен хак я могу отправлять любые координаты на сервер и в итоге овладею телепортацией
__________________
coming soon...

Старый 27.07.2009, 16:42
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 7  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
На сервере все данные должны поверяться, чтобы хаков небыло. А то, можно нажатие влево-вправо передавать не 30 раз в секунду, а 100 и разворачиваться в 3 раза быстрее.

Програмная часть не сведется к 100 строчкам кода. Потому что свой "кораблик" и "кораблик" противника должен двигаться независимо от того, опаздывают данные или нет(а в флеш реализован только tcp/ip сокет, это значит что задержки будут от 70мс и выше). Иначе будут двигаться рывками. Для этого и применяются алгоритмы сглаживания.

Старый 27.07.2009, 16:52
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 8  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
AlexStukoff, полностью согласен, кроме 100 строчек

BlooDHounD, если начинать движение только после получения подтверждения, то тогда получится что юзер нажимает кнопку, какое-то время ничего не происходит, а потом кораблик рывком перемещается вперед, и после этого уже летит плавно.

Идея в том, чтобы показывать движение сразу, без подтверждения, затем если приходит подтверждение то всё ок, если не приходит, то координаты и скорость корабля приходят вместе с новой порцией данных, и клиент корректирует отображение, т.е. ставит на место корабль, который якобы с него сдвинулся.

Короче по дефолту считается, что данные дошли, ибо успешная доставка происходит гораздо чаще, чем потеря сообщения.

Вопрос: какая частота пересчета данных на сервере приемлема для такой игры? 2 раза в секунду - хватит?
__________________
тонкий тролль, осеянный благодатью

Старый 27.07.2009, 17:06
AlexStukoff вне форума Посмотреть профиль Отправить личное сообщение для AlexStukoff Посетить домашнюю страницу AlexStukoff Найти все сообщения от AlexStukoff
  № 9  
Ответить с цитированием
AlexStukoff
 
Аватар для AlexStukoff

Регистрация: Dec 2007
Адрес: Stavropol
Сообщений: 65
Отправить сообщение для AlexStukoff с помощью ICQ
можно передавать и будут передавать Левые сервер реджектит, это нормальная практика. А вот развернутся в 3 раза быстрее уже не удастся, ибо вектор вычисляется на сервере на основании только валидных сигналов разворота.

Что делать с рыками и сглаживанием - это отдельная тема. В самом простом случае - полагаем что кораблик двигается туда, куда он двигался и раньше, пока не поступят новые данные с сервера.
Правда в этом случае возможны неприятные фишки формата "кораблик летит вверх и вдруг- БАЦ -и он уже летит влево да еще и прыгнул пикселов на 10-20"

Но в целом по вопросу борьбы с лагами я склоняюсь перед вашим iflamberg авторитетом
__________________
coming soon...

Старый 27.07.2009, 17:16
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 10  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
GAIKER, круто. делайте так потом будите думать как сделать мультиплэйер а то в вашей игре, каждый пользователь будет играть в свой кораблик. остальные всегда будут двигаться как попало и с неизвестным отставанием. если этим можно пренебречь, тогда - да. а если у Вас кораблик не умеет стрелять спиной, и должен стрелять всегда перед собой, и угол нужен при расчётах попадания, тогда Ваша идея утопична, так как пользователи будут стрелять во врагов, которых уже давно "там" нет.

Создать новую тему Ответ Часовой пояс GMT +4, время: 11:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
latency , socket , алгоритмы , игры , синхронизация

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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