Пятница, 27 Декабря 2024, 10:33

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
[GMS] Передача пакетов при открытии инвентаря
FormantДата: Вторник, 17 Ноября 2015, 12:55 | Сообщение # 1
частый гость
Сейчас нет на сайте
Всем доброго времени суток!

Возник некоторый вопрос, начал разработку MMORPG на Android [2D] с TCP соединением, и есть моменты которые и вызывают моё беспокойство.
Возьмём в пример обычное меню (где есть "Сумка", "Навыки", "Персонаж").
При нажатии на сумку происходит обыденное дело - открытие инвентаря. В этом есть и беспокойство, открытие инвентаря в клиенте.

Стоит ли при открытии делать запрос у сервера на его открытие? И делать ли простую передачу пакетов с инвентаря на сервер, на то что находится у него в сумке, и делать сверку?

Надеюсь дадут обоснованный и развёрнутый ответ :)
Заранее благодарен happy


Сообщение отредактировал Formant - Вторник, 17 Ноября 2015, 13:00
AI_DeveloperДата: Вторник, 17 Ноября 2015, 13:09 | Сообщение # 2
почетный гость
Сейчас нет на сайте
Доброго времени суток! По вашему вопросу мне кажется лучше будет если при открытии инвентаря клиент запросит предметы находящиеся в сумке этого игрока. Сервер, приняв ID пользователя смотрит в его сумку в БД и отправляет массив предметов клиенту. Далее на клиенте парсим массив...

Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает... и никто не знает почему!
dima9595Дата: Вторник, 17 Ноября 2015, 13:11 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
Не работал с гамаком, но как web-разработчик могу смело сказать, что проверять данные в онлайне стоит того. Если не проверять данные, то читер может добавить себе в инвентарь что угодно (не важно что, будь то это руда, алмазы и т.п., зависит от самой игры), так что обязательно стоит проверять.



Сообщение отредактировал dima9595 - Вторник, 17 Ноября 2015, 13:11
AI_DeveloperДата: Вторник, 17 Ноября 2015, 13:12 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Так же для игрового процесса рекомендовал бы использовать UDP. Так как целостность пакетов TCP могут вызвать ужасные лаги.

Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает... и никто не знает почему!
Quad69Дата: Вторник, 17 Ноября 2015, 14:24 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Лучше просто передавай содержимое инвентаря и всё.
XDominatorДата: Среда, 18 Ноября 2015, 07:25 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Цитата AI_Developer ()
Так же для игрового процесса рекомендовал бы использовать UDP. Так как целостность пакетов TCP могут вызвать ужасные лаги.


Вот только далеко не для всего он подходит, мягко говоря.
Но для некоторых вещей он необходим.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
AI_DeveloperДата: Среда, 18 Ноября 2015, 08:13 | Сообщение # 7
почетный гость
Сейчас нет на сайте
Цитата XDominator ()
Вот только далеко не для всего он подходит, мягко говоря.
Но для некоторых вещей он необходим.


С сетевым программированием GMS не сталкивайся, поэтому действительно могу что то упустить, но вот просто практика сетевого программирования особенно проектов на подобии MMORPG UDP сильно выручал )))) TCP работал на аутентификации авторизации, а UDP чисто на игровой процесс.


Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает... и никто не знает почему!
XDominatorДата: Среда, 18 Ноября 2015, 08:24 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Что можно в игре посадить на UDP, кроме передачи координат?
Даже чат на UDP нет смысла ставить, не говоря уж про инвентарь или экшн.
В разрезе ММОРПГ даже передача координат нерентабельна, т.к. там не нужна скорость, но нужна точность.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
AI_DeveloperДата: Среда, 18 Ноября 2015, 08:46 | Сообщение # 9
почетный гость
Сейчас нет на сайте
На TCP:
- Аутентификация и авторизация (!)
- Проверка обновлений (!)
- Чат (!)
- Лобби (!)

На UDP:
- Передача данных обновлений (!)
- Координаты
- Действия

TCP используем для уверенной целостности доставки пакетов в тех местах где действительно нужно. - (!)
UDP там где потеря пакетов, не критична. Если критична учим UDP проверять целостность пакетов.

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

Представим ситуацию MMORPG:
- Сервер TCP
- Клиент TCP

Где то что-то глюкнуло простой в игре около 10-20 сек и все сопровождалось потерей пакетами. Пока TCP все это до отправит у нас появляется задержка в конвейере пакетов. Теперь как игроку, ну была задержка - ладно. Остались эти 10-20 секунд в прошлом - пофиг. Самое главное чтобы актуальной текущее состояние до меня пришло и все а все что в момент лагов было - не интересно.

Представим ситуацию MMORPG:
- Сервер UDP
- Клиент UDP

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

Исходя из этого рекомендуется использовать TCP/UDP в паре по предназначению исходя из своих свойств.

P.S. Спасибо Cisco, TrinityCore и PvPGN за столь богатый опыт. )))


Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает... и никто не знает почему!

Сообщение отредактировал AI_Developer - Среда, 18 Ноября 2015, 08:50
FormantДата: Среда, 18 Ноября 2015, 10:21 | Сообщение # 10
частый гость
Сейчас нет на сайте
dima9595,
Цитата dima9595 ()
Не работал с гамаком, но как web-разработчик могу смело сказать, что проверять данные в онлайне стоит того. Если не проверять данные, то читер может добавить себе в инвентарь что угодно (не важно что, будь то это руда, алмазы и т.п., зависит от самой игры), так что обязательно стоит проверять.

Об этом и подумал я:)
AI_Developer, Спасибо за твой полезный и развёрнутый ответ happy Всё красиво, и хорошо :)
maksim1221232,
Передaвать содержимое сервером? Немного ли нагрузки на сервер? <_<

Теперь вопрос:
Как лучше сделать этот инвентарь? Т.е только в клиенте, и дальше связь с сервером, либо создаём инвентарь на сервере и просто делаем постоянную связь с клиентом, и отправляем данные, и принимаем если есть что-то новое. wacko


Сообщение отредактировал Formant - Среда, 18 Ноября 2015, 11:05
AI_DeveloperДата: Среда, 18 Ноября 2015, 10:30 | Сообщение # 11
почетный гость
Сейчас нет на сайте
В Базе данных сделать таблицу инвентарей привязанную к ID пользователей. В момент запроса клиента, сервер считывает данные с таблицы и передает клиенту (в любом событии исходя из Ваших условий).

Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает... и никто не знает почему!
FormantДата: Среда, 18 Ноября 2015, 11:06 | Сообщение # 12
частый гость
Сейчас нет на сайте
AI_Developer, ну теперь понятно happy
Проблемный он инвентарь сам по себе, а тут ещё и передача данных wacko
Quad69Дата: Среда, 18 Ноября 2015, 14:31 | Сообщение # 13
заслуженный участник
Сейчас нет на сайте
Цитата Formant ()
Передaвать содержимое сервером? Немного ли нагрузки на сервер?

Смотря как.
Когда игрок заходит, отправляй ему весь инвентарь, а когда игрок что то подобрал, сообщай ему об этом(типо положить item_id в ячейку i, с названием n и прочее).
XDominatorДата: Среда, 18 Ноября 2015, 14:41 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
Да ничего проблемного на самом деле нет. Долго - да, муторно - да. Но не особо сложно.

2 AI_Developer

Представим себе типичную ММОРПГ. Например l2. Ты предлагаешь делать координаты по UDP.
Игрок тыкает мышью, но его UDP пакет не доходит до сервера и персонаж стоит где стоял. Он тыкает еще раз - тоже самое. И еще раз - опят. Он закрывает клиент и идет вайнить на форум - какого хера я тыкаю мышью, а персонаж стоит? Если бы ты тоже самое делал по TCP - тогда такой проблемы бы не было, и даже если бы клиент посылал запросы во время лага, то с большой вероятностью в конце этого лага он либо побежал, либо уже оказался в точке где хотел быть(если лаг был не с исходящими пакетами, а с входящими). Не говоря уж о том с какой частотой у тебя с UDP будет происходить рассинхрон координат на сервере\клиенте, что будет порождать телепорты, баги с геодатой и застревание в ней же. 10 мс пинга того стоят? Не думаю.

А вот тебе другой пример - игра point blank. Если бы разработчики решили передавать в ней координаты по TCP, то эта и без того сомнительная поделка просто утонула бы в лагах, потому что как раз таки там крайне важна каждая миллисекунда в данный конкретный момент, но абсолютно неважно что делал игрок секунду назад, т.к. движение так или иначе привязано к клиенту и передача координат идет напрямую от него, а сервер максимум что делает - проверяет не превышает ли у игрока скорость изменения координат допустимые рамки (читай - спидхак).

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


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Среда, 18 Ноября 2015, 14:41
AI_DeveloperДата: Среда, 18 Ноября 2015, 14:54 | Сообщение # 15
почетный гость
Сейчас нет на сайте
Цитата XDominator ()
Да ничего проблемного на самом деле нет. Долго - да, муторно - да. Но не особо сложно.

2 AI_Developer

Представим себе типичную ММОРПГ. Например l2. Ты предлагаешь делать координаты по UDP.
Игрок тыкает мышью, но его UDP пакет не доходит до сервера и персонаж стоит где стоял. Он тыкает еще раз - тоже самое. И еще раз - опят. Он закрывает клиент и идет вайнить на форум - какого хера я тыкаю мышью, а персонаж стоит? Если бы ты тоже самое делал по TCP - тогда такой проблемы бы не было, и даже если бы клиент посылал запросы во время лага, то с большой вероятностью в конце этого лага он либо побежал, либо уже оказался в точке где хотел быть(если лаг был не с исходящими пакетами, а с входящими). Не говоря уж о том с какой частотой у тебя с UDP будет происходить рассинхрон координат на сервере\клиенте, что будет порождать телепорты, баги с геодатой и застревание в ней же. 10 мс пинга того стоят? Не думаю.

А вот тебе другой пример - игра point blank. Если бы разработчики решили передавать в ней координаты по TCP, то эта и без того сомнительная поделка просто утонула бы в лагах, потому что как раз таки там крайне важна каждая миллисекунда в данный конкретный момент, но абсолютно неважно что делал игрок секунду назад, т.к. движение так или иначе привязано к клиенту и передача координат идет напрямую от него, а сервер максимум что делает - проверяет не превышает ли у игрока скорость изменения координат допустимые рамки (читай - спидхак).

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


Да друг мой, мы с Blizzard и NCSoft ошиблись... передалаем на TCP. )))

Остались эти 10-20 секунд в прошлом - пофиг. Самое главное чтобы актуальной текущее состояние до меня пришло и все а все что в момент лагов было - не интересно.


Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает... и никто не знает почему!
OpenGOOДата: Среда, 18 Ноября 2015, 14:55 | Сообщение # 16
почти ветеран
Сейчас нет на сайте
Еще можно сумку разбить на вкладки, чтобы сократить размер пакета.

Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
AI_DeveloperДата: Среда, 18 Ноября 2015, 15:02 | Сообщение # 17
почетный гость
Сейчас нет на сайте
XDominator, Вот источник для познания нового дзена http://habrahabr.ru/post/209144/ почитай когда времени то будет.

Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает... и никто не знает почему!
XDominatorДата: Четверг, 19 Ноября 2015, 08:01 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
В статье написана какая то чушь.
Использовать только UDP в игре? гениально, браво. Особенно классно его будет использовать для систем типа инвентаря, менеджмента или какого-нибудь строительства, а особенно хорошо подойдет для чата, чтобы половина фраз пропадала у игроков.

Как я уже писал выше, далеко не для всех игр это подойдет даже для передачи координат, даже привел конкретный пример - lineage 2, потому что это skill-based игра с strategy-like управлением перемещением. И использовать UDP для чего либо там станет только полный отморозок.

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


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
FormantДата: Четверг, 19 Ноября 2015, 15:31 | Сообщение # 19
частый гость
Сейчас нет на сайте
XDominator, думаю у Вас получится лучше дать мне пояснение к одному моменту. Регистрация.
В идеале должно быть так:
Игрок заходит в клиент - нажимает "Играть" - переходит в регистрацию если нет профиля (ввод E-mail, пароля), - создаём его уникальный id и привязываем E-mail к нему - оставляем профиль в его памяти - снова нажимает "Играть" вводит E-mail, пароль, отправляет на сервер свои данные для входа - сервер проверяет есть ли такой E-mail и совпадает ли пароль, и отправляет клиенту разрешение на вход, либо указать что не так (Не правильный ввод).

Думаю что можно вести эту тему для написания статьи (Networkig)

Цитата XDominator ()
Использовать только UDP в игре? гениально, браво. Особенно классно его будет использовать для систем типа инвентаря, менеджмента или какого-нибудь строительства, а особенно хорошо подойдет для чата, чтобы половина фраз пропадала у игроков.


И в каких же моментах можно использовать UDP? Всё таки координаты игроков важны, т.к игра подразумевает не тупое убийство вражеских монстров и сбора травки, а те же данжи(инсты, подземелья), PvP бои. Потеря координат игрока может оказаться критичной для игрока, нажав чтобы добежать до кого либо, он просто встал и ничего не делает. Итог - умер, от того кому всё таки отправился пакет... Не очень то и забавно.


Сообщение отредактировал Formant - Четверг, 19 Ноября 2015, 15:33
XDominatorДата: Пятница, 20 Ноября 2015, 07:33 | Сообщение # 20
постоянный участник
Сейчас нет на сайте
Ну как я уже писал выше, UDP необходимо использовать для координат в онлайн шутерах, типа CS, PB, и всего такого. там как раз решают миллисекунды, и перемещение основывается на передаче конечных координат, а не нажатий клавиш игроков. UDP также желатльно использовать при подгрузке больших данных с сервера - передача карт например, но этот UDP уже будет с обратной связью от клиента для контроля целостности загрузки карты. При нормальном соедиинении это значительно увеличит скорость загрузки, при плохом - будет тоже самое что и TCP.

Привязать стрельбу, инвентарь, и даже перемещение в некоторых играх к UDP нельзя. Этот протокол подходит для постоянно, непрерывно обновляющихся данных - та же голосовая связь например. Но если игрок стреляет - то нельзя позволить системе проглотить этот выстрел из-за плохого интернета. Если игрок использует скилл - то нельзя позволить пропасть тому пакету, который сообщает об этом серверу.

По поводу регистрации не совсем понял что нужно пояснить. В идеале логин\пароль хранятся в БД. В момент когда игрок регистрируется - данные проверяются на корректность(неправильные символы, пробелы т.д.) и заносятся в бд. Потом, когда игрок логинится, делаешь запрос к БД по полям, заданным пользователем как логин и пароль, и если запрос возвращает тебе запись, соответствующую этим полям - значит игрок залогинен корректно и с помощью ИД его аккаунта можно подгружать из бд всю дополнительную связанную информацию. Теоретически, к этой же бд можно подключить сервер для твоего сайта, мобильного приложения или еще чего угодно, и тогда все это объединится в единую систему. Как конкретно это все реализовать не подскажу, т.к. сам такие системы, честно говоря, не разворачивал. Но по такому принципу, например, работают пиратские сервера lineage 2, ну и собственно не пиратские тоже.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг