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

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.11.2013, 16:34
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 1  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
Question realtime передача координат

Доброго всем дня, давеча столкнулся с такой проблемой:

С товарищем напару пишем онлайн игрушку. Решили использовать TCP протокол для передачи данных, после чего сразу же стали наступать на всевозможные неприятности при его использовании, как то, например отправка нескольких "пакетов" одной большой пачкой в склеенном виде.

Решение для этой проблемы нашлось довольно быстро: стали просто обозначать заголовки у пакетов, после чего "слипшиеся" фрагменты пакетов перестали представлять собой проблему.

На клиенте я реализовал таймер той же длительности, что и время цикла отправки сообщений на сервере. Итого, раз в определенный промежуток времени, я просто вычитываю из потока пакет. вся фигня в том, что иногда в поток пакет еще не пришел целиком и клиент продолжает ждать, до следующего тика, пока пакет не будет собран полностью, вследствие чего игрок на поле постоянно "дрыгается".

Занятная закономерность состоит в том, что если клиент постоянно посылает серверу данные, то получает он их в ответ с меньшей задержкой.

как вылечить багу?

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

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Передавать "слепок мира" - плохая идея.
__________________
Отряд Котовскага

Старый 14.11.2013, 18:27
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 3  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
Какой-то старнный алгоритм чтения данных, Socket позвояет подписаться на событие ProgressEvent.SOCKET_DATA, в нем и нужно считывать данные, таймер не нужен. Что касается рассинхронизаций - в одно время долго пытался наладить синхронизацию клиентов в р2р-сети, к сожалению, так и не удалось достичь необходимого урвоня детерминированности игрового мира - уж не знаю, Flash тому виной, или я недостаточно постиг дзен, но, как мне кажется, для Flash-клиента такой метод не подходит - в силу низкой точности таймеров и вычислений. Потому перешел на иерархическую клиент-серверную архитектуру, где все расчёты игрового мира проводит сервер, выдавая клиентам только информацию об изменениях. Но и с этим архитектурным решением порой появляются проблемы с синхронизацией, впрочем, это уже пробелмы реализации.
Реализацией своего протокола не заморачивался, есть готовые библиотеки для работы с AMF(по крайней мере, под Java и C# - точно есть), очень удобный формат, использую его даже для клиент-серверных приложений без использования Flash(в качестве альтернативы можно посмотреть protobuf). Если есть проблемы с буферизацией сообщений(т.н. "слипание"), советую проверить, реализована ли очискта буфера исходящего потока на сервере после записи сообщения(обычно это метод flush).

P.S. Когда-то на форуме проскакивала ссылка на 2D игрушку, а-ля Quake, автором которой, если не ошибаюсь, являлся кто-то из завсегдатаев flasher.ru. К сожалению, не могу найти ссылку, но это была единственная игрушка на AS, в которой был нормально реализован real-time multiplayer, по крайней мере из тех, что я видел - возможно кто-то помнит о чем речь, и подскажет ссылку и контакты автора, буду благодарен.

Старый 15.11.2013, 08:56
bifidokk вне форума Посмотреть профиль Отправить личное сообщение для bifidokk Найти все сообщения от bifidokk
  № 4  
Ответить с цитированием
bifidokk
 
Аватар для bifidokk

Регистрация: Jan 2011
Сообщений: 200
Цитата:
Сообщение от Котяра Посмотреть сообщение
Передавать "слепок мира" - плохая идея.
почему? сложно сделать откат, если какие-то данные из всей "пачки" не пройдут?

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

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

http://www.gamedev.ru/code/articles/?id=4262
http://www.gamedev.ru/code/articles/?id=4261
http://www.gamedev.ru/code/articles/?id=4260
http://www.gamedev.ru/code/articles/?id=4259

вот еще просто и понятно про интерполяцию координат для сглаживания задержек, это пожалуй даже больше по теме
http://www.ant-karlov.ru/PlayerIO-in...ir-obmana.html
http://www.ant-karlov.ru/PlayerIO-re...zaderzhek.html
__________________
тонкий тролль, осеянный благодатью


Последний раз редактировалось Gaen; 15.11.2013 в 14:51.
Старый 15.11.2013, 17:22
Фенёк вне форума Посмотреть профиль Отправить личное сообщение для Фенёк Найти все сообщения от Фенёк
  № 6  
Ответить с цитированием
Фенёк

Регистрация: May 2011
Сообщений: 221
Ага, ок, спасибо за статьи, почитаю, отпишусь. На данный момент времени практически удалось довести приведенный мною способ до ума

----
UPD Вобщем отчитываюсь:

Таки алгоритм удалось настроить так, чтобы действия были плавными.

Механизм не странный, просто решили сформировать свой бинарный протокол передачи данных, с целью уменьшения объема пересылаемых данных.

Поскольку TCP протокол так устроен, что отправляет данные кусками размеры которых определяет сам, иногда происходило склеивание информации, то есть за один раз(то есть, например, сервер раз в 100 мс хочет отправлять данные, но протокол их не отправляет(по какой-то еще не известной мне причине), зато отправляет их на следующую итерацию вместе с данными сформированными на текущей итерации), мне могло прийти две итерации перемещения игрока. Тогда мы стали дорисовывать данным заголовок и конец, разделяя их таким образом на пакеты. соотвественно вычитывать за один раз сразу обе итерации перемещения персонажа не имеет смысла, был создан таймер, который раз в определенное время доставал из потока пакет и обрабатывал его, пока остальные данные в пути.

вобщем получилось сбивчиво несколько.

И да, почему передавать слепок мира плохо?


Последний раз редактировалось Фенёк; 15.11.2013 в 19:19.
Старый 22.11.2013, 16:43
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 7  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Цитата:
И да, почему передавать слепок мира плохо?
— нерационально. Лучше передавать изменения.
__________________
hauts.ru

Старый 22.11.2013, 17:48
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от Hauts Посмотреть сообщение
— нерационально. Лучше передавать изменения.
Все время - да. Но время от времени нужно и слепок передавать. Чтобы наверняка все расхождения подкорректировать

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

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
caseyryan, да, конечно.

Я не упомянул про это надеясь на то, что это будет очевидным, как сделают передачу изменений
__________________
hauts.ru

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

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

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


 


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


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