Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: Сети
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
helena_1990
3 / 3 / 1
Регистрация: 23.08.2017
Сообщений: 52
1

Игра, сервер и клиент

03.12.2017, 15:27. Просмотров 1517. Ответов 32
Метки нет (Все метки)

Добрый день.
Решила я написать простенькую игру для развития реализации дальнейших планов. Пишу на С++ под Linux/BSD платформы и только!
На данный момент есть 3D мир и катающиеся по нему шарик - которым я могу управлять.
Прекрасно понимаю что такое TCP/UDP, сокеты. Писала простенькие клиент-серверные приложения стандартными средствами. Сейчас начинаю изучать boost asio для экономии времени и удобства, по крайней мере мне так кажется.
Суть моей задачи написать северную и клиентскую часть для игры о которой написала выше.
Шар в игровом мире начинает двигаться и теоретически клиент должен слать на сервер данные и получать разрешение на действие..

и так.. Что собственно мне не понятно.
Какие данные должен слать клиент игры на сервер, json, xml, serialization просто какие-то бинарные данные ?
как происходит этот механизм отправки данных?
Раньше на простых приложениях я просто подключалась к порту сервера и отправляла json и в конце "\n" что означало конец связи. Я же не могу для игры при каждом движении шара открывать сокет каждый раз и после завершать соединение верно ?! Значит нужно удерживать соединение.
А если удерживать соединение, то какой тип данных слать, если json то там много лишнего мусора будет, за секунду шар может поменять 10-100 разных координат в зависимости от скорости самого шара. А еще клиент должен получить ответ от сервера что можно двигаться по этим точкам и там нет преград.
А самое не понятное мне, это если 2 и больше шариков - которыми управляют другие пользователи.
Как мне получать координаты всех шариков пользователей в реальном времени ?
Между нами сервер, как-то слушать нужно или как это работает ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2017, 15:27
Ответы с готовыми решениями:

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

Tcp ip клиент-сервер C++ сервер выводит мусор
server # include <sys/types.h> # include <iostream> # include <winsock2.h>...

Клиент/сервер: клиент посылает серверу слово; определить, является ли это слово палиндромом
Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP....

Клиент-сервер
Как написать программу клиент-сервер, самую простую, например что бы клиент мог...

Клиент-сервер
Нужно передать дание по локальной сетке. нашел пример, ввел его, но он не...

32
vxg
Модератор
3252 / 2052 / 323
Регистрация: 13.01.2012
Сообщений: 7,945
04.12.2017, 06:20 2
Лучший ответ Сообщение было отмечено helena_1990 как решение

Решение

helena_1990,
-можно не закрывать сокет
-можно слать UDP
-можно слать бинарные данные хотя для ваших объёмов разницу увидеть сложно
-можно после отправки своих координат получать в ответе координаты других
1
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
04.12.2017, 10:41 3
Цитата Сообщение от helena_1990 Посмотреть сообщение
Как мне получать координаты всех шариков пользователей в реальном времени ?
зависит от того, кто рулит.
если рулит сервер, то все шарики хранятся на сервере, а клиент лишь исполняет у себя то, что сказал ему сервер.
если же каждый игрок рулит своим шаром, то каждый игрок должен своим товарищам по серверу отправлять свои координаты.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Какие данные должен слать клиент игры на сервер, json, xml, serialization просто какие-то бинарные данные ?
зависит от игры. если важна производительность, то бинарные подойдут лучше, т.к. их парсинг занимает меньше времени.
Цитата Сообщение от helena_1990 Посмотреть сообщение
как происходит этот механизм отправки данных?
в смысле как? конкретный вопрос задайте.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Я же не могу для игры при каждом движении шара открывать сокет каждый раз и после завершать соединение верно ?! Значит нужно удерживать соединение.
зависит от протокола транспортного уровня(ТСР/UDP).
Цитата Сообщение от helena_1990 Посмотреть сообщение
за секунду шар может поменять 10-100 разных координат в зависимости от скорости самого шара.
вам надо определиться с тем, кто всё-таки рулить будет, сервер или клиент.
сейчас большинство игр основываются на топологии клиент-сервер, т.к. так проще всего защитить свою игру.

советую книгу почитать, так хотя бы сложится понимание о том, что вы вообще хотите.
https://www.ozon.ru/context/detail/id/137764980/
P.S. книгу можно найти в интернете.
2
helena_1990
3 / 3 / 1
Регистрация: 23.08.2017
Сообщений: 52
04.12.2017, 15:45  [ТС] 4
Цитата Сообщение от vxg Посмотреть сообщение
можно слать бинарные данные хотя для ваших объёмов разницу увидеть сложно
решила boost_serialization использовать, малые расходы на трафик.

Цитата Сообщение от GbaLog- Посмотреть сообщение
зависит от того, кто рулит.
Рулит сервер. Диаметр всех шариков и координаты x,y хранятся на сервере.

Цитата Сообщение от GbaLog- Посмотреть сообщение
зависит от протокола транспортного уровня(ТСР/UDP).
решила UDP т.к игра будет быстрой в реальном времени.

Цитата Сообщение от GbaLog- Посмотреть сообщение
вам надо определиться с тем, кто всё-таки рулить будет, сервер или клиент.
сейчас большинство игр основываются на топологии клиент-сервер, т.к. так проще всего защитить свою игру.
Сервер есть и все проверки будут лежать на нем..

Цитата Сообщение от GbaLog- Посмотреть сообщение
Сообщение от helena_1990
как происходит этот механизм отправки данных?
в смысле как? конкретный вопрос задайте.
Как синхронизировать данные всех игроков ?
Нажала кнопку W, шарик начал движение, запустился механизм отправки пакетов на сервер о нажатой кнопке?!
Получается данные нужно отправлять в секунду n-раз? Я не понимаю как нужно синхронизировать данные между всеми.
Если я буду запрашивать раз в секунду с сервера координаты всех шариков это не будет похоже на некую ДДОС атаку на сервер ?
Получается не совсем в реальном времени если игра будет запрашивать данные раз в секунду. Шарики столкнулись а на сервере этого еще не видно из-за пинга. Или у кого-то медленный интернет то его шарик будет дергаться что для 3D мира с физикой совсем ужасно. Это как-то решается интерполяцией или как ?
0
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
04.12.2017, 16:01 5
Лучший ответ Сообщение было отмечено helena_1990 как решение

Решение

Цитата Сообщение от helena_1990 Посмотреть сообщение
Нажала кнопку W, шарик начал движение, запустился механизм отправки пакетов на сервер о нажатой кнопке?!
вы отправляете пакет на сервер только тогда, когда производите какое-то действие.
например, нажали W - отправили событие нажатия на сервер.
отпустили - отправили событие об этом и т.д.
сервер же, в свою очередь, шлёт вам новые координаты игры n раз в секунду и вы по ним, соответственно, двигаете шарик.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Если я буду запрашивать раз в секунду с сервера координаты всех шариков это не будет похоже на некую ДДОС атаку на сервер ?
вы не должны ничего запрашивать, сервер сам вам отправляет актуальные данные, вы только можете послать ответ, мол, пакет получен и т.д.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Шарики столкнулись а на сервере этого еще не видно из-за пинга.
шарики могут столкнуться только и только на сервере, т.к. вся обработка должна происходить там.
по сути клиент только двигает шарик и делает его движение плавным с помощью всяких математических вычислений(в т.ч. интерполяцией), а так же отсылает команды пользователя.

всё-таки рекомендую прочесть ту книгу, которую я давал выше.
после неё большинство вещей встанет на свои места.
1
helena_1990
3 / 3 / 1
Регистрация: 23.08.2017
Сообщений: 52
04.12.2017, 16:25  [ТС] 6
Цитата Сообщение от GbaLog- Посмотреть сообщение
сервер же, в свою очередь, шлёт вам новые координаты игры n раз в секунду и вы по ним, соответственно, двигаете шарик.
Получается чем быстрее игра, тем больше запросов нужно слать. Начинаю понимать...

Цитата Сообщение от GbaLog- Посмотреть сообщение
шарики могут столкнуться только и только на сервере
Поняла спасибо.

Цитата Сообщение от GbaLog- Посмотреть сообщение
всё-таки рекомендую прочесть ту книгу
Полезла искать pdf, если у вас есть буду очень рада.

Всем спасибо

Добавлено через 13 минут
Цитата Сообщение от helena_1990 Посмотреть сообщение
Полезла искать pdf
нашла )
0
Lolobotik
218 / 44 / 18
Регистрация: 10.06.2015
Сообщений: 130
28.12.2017, 09:48 7
вы отправляете пакет на сервер только тогда, когда производите какое-то действие.
например, нажали W - отправили событие нажатия на сервер.
отпустили - отправили событие об этом и т.д.
сервер же, в свою очередь, шлёт вам новые координаты игры n раз в секунду и вы по ним, соответственно, двигаете шарик.
Я, конечно, мимокрокодил, но, по-моему, не самая лучшая идея. Практически во всех онлайн играх, что я видел, клиент сам рулил своим передвижением, а сервер лишь изредка имел возможность "одёрнуть" игрока, если произошла какая-либо рассинхронизация. "Двигать шарик" непосредственно по ответам от сервера и накладно (на каждый "условный кадр" по пакету слать? а для быстрой игры совсем ахтунг) и не очень отзывчиво. Нажали на кнопку "W" и ждём:
1)обработку нажатия на клавишу
2)отправку сообщения серверу
3)время передачи до сервера
4)обработчик поступивших данных сервера
5)отправку сообщения обратно
6)время передачи до клиента
7)вот только теперь меняем координаты и перерисовываем кадр???

По мне так совсем не торт. Нельзя на каждый чих спрашивать разрешение у сервера. Подтверждение нужно получать только для каких то более существенных действий. В том же Wow при отвале от сервера можно ещё побегать пару секунд, пока клиент пытается переподключиться, а вот применить какую-нибудь способность уже не выйдет, клиент будет ожидать ответ от сервера (так и будешь бегать с активной иконкой скила, и анимацией его начала, пока ответ не придёт или таймаут дисконекта не выкинет в меню).
1
helena_1990
3 / 3 / 1
Регистрация: 23.08.2017
Сообщений: 52
28.12.2017, 11:50  [ТС] 8
Цитата Сообщение от Lolobotik Посмотреть сообщение
Нельзя на каждый чих спрашивать разрешение у сервера
Я так и сделала - не спрашиваю у сервера всё подряд. У меня на сервере видны только столкновения или какое-то особое действие, скажем прыжок, и если предыдущие данные те-же, их не передает на сервер(шарик стоит на месте или двигается только по оси X). Кадры с координатами при хорошей оптимизации в сериализации совсем не пугают сервер как выяснилось на тестах. порядка 10 udp кадров в секунду(думаю лучше больше сделать) ну и интерполяция объектов хорошо спасает. Сделала эмуляцию из 10000 клиентов, и совсем нагрузки нет как на сеть(ушло ~10mbit), так и на процессор(Xeon(R) CPU E5-2603 v4) не топ. Хотя репликация объектов у меня не идеальная но я стараюсь
0
lArtl
220 / 100 / 45
Регистрация: 09.10.2014
Сообщений: 571
Завершенные тесты: 3
28.12.2017, 23:26 9
Цитата Сообщение от Lolobotik Посмотреть сообщение
Практически во всех онлайн играх, что я видел, клиент сам рулил своим передвижением...
Вот раздолье для читеров)
К примеру в танках весь рендер происходит на стороне сервера. Вот это тема) Всякие там валлхаки, телепортеры идут лесом. И подделка исходящих пакетов не имеет смысла.
0
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
29.12.2017, 05:54 10
Цитата Сообщение от Lolobotik Посмотреть сообщение
на каждый "условный кадр" по пакету слать?
вы успеете нажать хотя бы 60 клавиш за секунду?
Цитата Сообщение от Lolobotik Посмотреть сообщение
Нажали на кнопку "W" и ждём:
нет, не так.
нажали клавишу и бежим туда, куда нажали, а если сервер внезапно решит, что ты читер и не мог туда прийти, то тебя вернёт назад на позицию, которую сервер просчитал.
это нужно для того, чтобы читы было невозможно сделать, имея только влияние на клиента.
вы видели когда-нибудь WarCraft III? там всё на стороне клиента делается и там постоянно страдали от мапхака, да и сейчас страдают, т.к. сделать его - раз плюнуть.
Цитата Сообщение от Lolobotik Посмотреть сообщение
Нельзя на каждый чих спрашивать разрешение у сервера.
это от игры зависит.
в динамичных играх надо продумывать, на какие действия надо спрашивать разрешения.
например, на поворот камеры не надо, а на изменение направления движения надо, даже если ты на 1 градус отклонился, т.к. все объекты, я ещё раз говорю, обрабатывает сервер и он же ими рулит, клиент просто исполнитель команд и посыльный действий клиента.
0
Lolobotik
218 / 44 / 18
Регистрация: 10.06.2015
Сообщений: 130
29.12.2017, 15:33 11
Фразы
сервер же, в свою очередь, шлёт вам новые координаты игры n раз в секунду и вы по ним, соответственно, двигаете шарик.
и
нажали клавишу и бежим туда, куда нажали, а если сервер внезапно решит, что ты читер и не мог туда прийти, то тебя вернёт назад на позицию...
звучат, если честно, диаметрально противоположно. Если бы сразу был описан второй вариант, или слова подобраны более тщательно, у меня не было бы никаких вопросов.

в динамичных играх надо продумывать, на какие действия надо спрашивать разрешения.
например, на поворот камеры не надо, а на изменение направления движения надо, даже если ты на 1 градус отклонился
Это тёмная для меня тема, так что не буду спорить, но пример про Wow из моего прошлого поста вполне актуален.
0
helena_1990
3 / 3 / 1
Регистрация: 23.08.2017
Сообщений: 52
29.12.2017, 16:07  [ТС] 12
Цитата Сообщение от lArtl Посмотреть сообщение
Вот раздолье для читеров)
В танках работает по udp и непрырывно отсылаются данные 10-30 раз в секунду, но проверяются они не с той же частотой а в расчете на интерполяцию, и если кто-то "телепортируются" то его просто отключат от сервера. А вот например во время выстрела отправляются больше данных на проверку, по этой причине иногда видно небольшие лаги что и логично. Кстати по этой причине еще что данные не проверяются каждый кадр еще видно после боя, когда бой закончен а танк куда-то еще там едет. Не думаю что рендер происходит на сервере а то бы его положили уже, просто ось координат в матрице проверяется и это совсем не накладно.
0
lArtl
220 / 100 / 45
Регистрация: 09.10.2014
Сообщений: 571
Завершенные тесты: 3
29.12.2017, 17:02 13
Цитата Сообщение от helena_1990 Посмотреть сообщение
Не думаю что рендер происходит на сервере...
На сервере ( под этим подразумевается, что данные о движении танка отправляются на сервер, а с сервера - то, что должно отображаться в данный момент).
0
helena_1990
3 / 3 / 1
Регистрация: 23.08.2017
Сообщений: 52
29.12.2017, 17:21  [ТС] 14
Цитата Сообщение от lArtl Посмотреть сообщение
На сервере
Вот и я имею ввиду что расчет не совсем как понятия рендера с использованием графических библиотек а гораздо проще
0
lArtl
220 / 100 / 45
Регистрация: 09.10.2014
Сообщений: 571
Завершенные тесты: 3
29.12.2017, 17:41 15
Цитата Сообщение от helena_1990 Посмотреть сообщение
Вот и я имею ввиду что расчет не совсем как понятия рендера с использованием графических библиотек а гораздо проще
Ну да, рендеринг на стороне сервера, Server Side Rendering, SSR - это не рендеринг с использованием графических библиотек)
0
helena_1990
3 / 3 / 1
Регистрация: 23.08.2017
Сообщений: 52
29.12.2017, 17:53  [ТС] 16
Цитата Сообщение от lArtl Посмотреть сообщение
Ну да, рендеринг на стороне сервера, Server Side Rendering
SSR явно не для серверов WOT. Вот бы было весело посмотреть как упадет кластер даже на 1к онлайн игроков )) Там уже не рилтайм а пошаговая стратегия бы получилась с 0 fps
0
lArtl
220 / 100 / 45
Регистрация: 09.10.2014
Сообщений: 571
Завершенные тесты: 3
29.12.2017, 17:59 17
Цитата Сообщение от helena_1990 Посмотреть сообщение
SSR явно не для серверов WOT. Вот бы было весело посмотреть как упадет кластер даже на 1к онлайн игроков )) Там уже не рилтайм а пошаговая стратегия бы получилась с 0 fps
Вы троллите?)
0
helena_1990
3 / 3 / 1
Регистрация: 23.08.2017
Сообщений: 52
29.12.2017, 21:28  [ТС] 18
Цитата Сообщение от lArtl Посмотреть сообщение
Вы троллите
Не совсем просто SSR технология не совсем для этих задач. В случае с WOT оптимизация на уровне сети координат. А модель просчета траекторий на сервере не требует рендеринга как самого понятие в это вложенного. Просчитать матрицу координат вершин куда легче. Ну я так думаю, а как оно работает на самом деле нам точно не скажут
0
Fulcrum_013
1588 / 1071 / 124
Регистрация: 14.12.2014
Сообщений: 8,822
Завершенные тесты: 3
02.01.2018, 12:57 19
Лучший ответ Сообщение было отмечено helena_1990 как решение

Решение

Цитата Сообщение от helena_1990 Посмотреть сообщение
А самое не понятное мне, это если 2 и больше шариков - которыми управляют другие пользователи.
т.е. в данном случае существует 2 подхода - авторитарный сервер и неавторитарный. Авторитарный - клиенты отправляют нажатия клавиш. Сервер все это обсчитывает и обновляет состояния игровых объектов у клиентов (т.е. рассылает каждому новые координаты и т.д.). Это в плане нахождения консенсуса наиболее удобно - т.е. все считает сервер в случая рассогласования клиент автоматом не прав.
Второй вариант - неавторитарный сервер. Он занимается только тем что реплицирует присланные события (нажатия клавиш и т.п.) другим игрокамб весь счет происходит на компе каждого. При таком варианте сервер в принципе не обязательное явление. каждый может отсылать события всем другим вообще напрямую. Но нахождение консенсуса вопрос практически неразрешимый.
Вариант третий - каждый считает логику/физику только для своего перса и отправляет обновления координат/статуса всем остальным через сервер или напрямую. Это в плане возможности читов вообще фирменное безобразия.При этом попытки делать какой то античит в конечном итоге разовьются до авторитарного сервера.
Теперя подробнее про минусы авторитарного: нагрузка по моделированию физики/логики на один комп (сервер) и опять же нагрузка по сетевому трафику. Ну с физикой/логикой тут ничего не попишешь. А вот с трафом методы есть.
Суть в чем - обычно в играх не все персонажи играбельны. т.е. есть игроки и есть NPC (в простонородье неписи) управляемые компьютером. Очевидно что состояние игроков серверу необходимо рассылать по любому. А вот с неписями все гораздо интереснее. Им можно рассылать только обновления параметров управляющего ими ИИ. Причем при наличии
группового ИИ рассылать можно обновления группе а не каждому отдельному неписю. Синхронность их работы обеспечивается тем что один и тот же алгоритм дает одни и те же результаты при одних и тех же исходных данных.
Второй апгрейд - серв так или иначе считает видимость игроком других игроков/неписей/изменяемых объектов и шлет обновления только тех объектов которые игрок видит/с которыми так или иначе взаимодействует по правилам игры.

Добавлено через 7 минут
Цитата Сообщение от helena_1990 Посмотреть сообщение
Значит нужно удерживать соединение.
Обычно делают несколько сокетов на каждого клиента. Как минимум один удерживающий коннекцию TCP для тех сообщений доставка которых должна быть гарантированна. К примеру сообщений о появлении другого игрока в поле зрения (а соответственно по такому сообщению клиент должен создать соответствующий объект и как то связать свой внутренний ID объекта с ID объекта на сервере). второй сокет UDP для сообщений которые актуальны только какое то время. К примеру апдейт координат другого игрока. Т.е. если несколько пакетов выпадут то за время их повторной передачи эти данные уже потеряют актуальность. при этом актуален будет последний по времени отправки с сервера пакет. Соответственно повторно отсылать выпавшие пакеты для таких апдейтов не имеет никакого смысла.

Добавлено через 1 минуту
Это то что касается реалтайм игр. Для пошаговых стандартная система запрос/ответ.

Добавлено через 1 час 53 минуты
Цитата Сообщение от helena_1990 Посмотреть сообщение
Просчитать матрицу координат вершин куда легче.
Коллизия выпуклых многоугольников - O(n^3) скалярных произведений от количества вершин.
Цитата Сообщение от helena_1990 Посмотреть сообщение
В случае с WOT оптимизация на уровне сети координат
Там оптимизация и рядом не ночевала. По всей видимости куча видеокарт обсчитают коллизии чрез PhysX. Во всяком случае коллизион меши там именно под PhysX заточены - сборники лоуполи выпуклых многогранников. типа шестигранника вместо цилиндра.
Цитата Сообщение от helena_1990 Посмотреть сообщение
А модель просчета траекторий на сервере не требует рендеринга как самого понятие в это вложенного.
Модель просчета нет. А вот защита от читов будет абсолютной или почти абсолютной только при серверном рендеринге. Других реальных способов от прозрачных текстур препятствий и текстур повышенной заметности целей других игроков не существует. Да и с автоаимом куда потруднее станет чем при использовании точных координат цели извлеченных из клиента.
1
helena_1990
3 / 3 / 1
Регистрация: 23.08.2017
Сообщений: 52
03.01.2018, 19:08  [ТС] 20
Не думаю что они используют cuda++ на серверах. Это же сколько нужно купить оборудования. Wargamming конечно не бедные ребята но не настолько чтобы покупать сотни тысяч серверов с видео-картами которые морально быстро устаревают. Сделают новые фишки какие-то и все сервера апгрейдить ? А синхронизировать как ? На одном только RU1 больше ~100к игроков онлайн. А расчет до ms. Хотя с другой стороны иногда ПТ-САУ попадает в окна по интересной траектории.. В принципе для коллизий можно использовать совсем примитивы. Часто видно как снаряд попадает куда-то вот совсем не туда. Ну ладно это от темы я уже ушла
Я пока что сделала сериализацию всего мира на сервере + просчет вершин и поверхностей mesh достаточно большого мира, и без GPU всё летает на моем слабеньком сервере Вот я и думаю что в wot тоже не обязательно прибегать к таким суровым методам как использоватье 10ки тысяч GPU ))
0
03.01.2018, 19:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2018, 19:08

Клиент сервер
Здравствуйте, задали в институте написать клиент серверное приложение на си...

Клиент - сервер
Здравствуйте! У меня возникла проблема с "клиент сервер" программой . Не могу...

КЛИЕНТ-СЕРВЕР
Попробовала изменить сервер следующим образом: #define...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru