Просмотр полной версии : Передача координат положения игроков
TurboDizel
04.04.2013, 17:24
Появилась такая проблема. Игра мультиплеер, на карте к примеру 10 игроков, и каждый клиент должен получать координаты остальных девяти. Каким образом эти координаты передавать будет правильнее, в плане улучшения производительности для сервера?
Т.е., чтобы понять вопрос правильно, я, например, передаю каждый кадр (уроков на данную тему не нашел вообще, всё пришлось самому пробовать, поэтому попробовал первым, что пришло в голову), но так как каждый кадр это 30 раз в секунду, то когда игроков на карте > 10, то сервер начинает тормозить. Если передавать только нажатие клавиш, а двигались игроки уже чтобы только у самих клиентов, то малейшие проблемы с интернетом, и один и тот же игрок на разных экранах будет в разных местах.
И ещё по поводу передачи в каждом кадре: ещё же ведь должны быть комнаты, и в каждой, например, по 10 человек. 10 комнат это 100 человек, и сервер вообще потухнет). Для каждой комнаты отдельный vps регистрировать что ли? Накладно было бы.
Заранее благодарю за ответы).
уроков на данную тему не нашел вообще, всё пришлось самому пробовать, поэтому попробовал первым, что пришло в голову
http://www.ant-karlov.ru/PlayerIO-reshenie-problemi-zaderzhek.html#item6318
Добавлено через 43 секунды
Лучше начинайте читать сначала. Внизу есть содержание.
TurboDizel
04.04.2013, 17:41
http://www.ant-karlov.ru/PlayerIO-reshenie-problemi-zaderzhek.html#item6318
Добавлено через 43 секунды
Лучше начинайте читать сначала. Внизу есть содержание.
Спасибо!! Именно что-то подобное и искал!
caseyryan
04.04.2013, 18:08
Не надо ничего передавать каждый кадр. Нужно передавать только изменившиеся данные. Наверняка все игроки не меняют координаты в каждом кадре. Кто-то стоит на месте, кто-то, возможно копается в инвентаре. Зачем отправлять данные о них на сервер?
У меня всегда на клиенте есть проверка на то изменились ли данные перед отправкой. Если нет, отправки не происходит.
TurboDizel
04.04.2013, 21:34
Не надо ничего передавать каждый кадр. Нужно передавать только изменившиеся данные. Наверняка все игроки не меняют координаты в каждом кадре. Кто-то стоит на месте, кто-то, возможно копается в инвентаре. Зачем отправлять данные о них на сервер?
У меня всегда на клиенте есть проверка на то изменились ли данные перед отправкой. Если нет, отправки не происходит.
Это такой "активный платформер", в котором все двигаются почти всегда, т.е. без движения умираешь почти сразу. Так что даже с проверками данные все равно будут отправляется почти постоянно.
caseyryan
04.04.2013, 21:46
Значит надо придумывать как сократить количество данных. Ну и проверки все равно ввести.
Плюс фрейм рейт можно уменьшить, и данные отправлять не в каждом кадре, а, скажем, через кадр
Есть масса способов уменьшить трафик и нагрузку на сервер
TurboDizel
05.04.2013, 11:22
Значит надо придумывать как сократить количество данных. Ну и проверки все равно ввести.
Плюс фрейм рейт можно уменьшить, и данные отправлять не в каждом кадре, а, скажем, через кадр
Есть масса способов уменьшить трафик и нагрузку на сервер
Ну в общем-то можно так, просто думал есть какие-то существующие способы.
iflamberg
05.04.2013, 14:59
А это и есть существующие способы. Например. Средний пинг - не менее 50ти. Это означает, что нет смысла посылать данные чаще, чем 20 раз в секунду. Особенно, если tcp/ip, они только будут скапливаться в буфере.
У тебя же не такие большие объемы данных, чтобы архивировать посылку.
А вообще странно, что у тебя на 10 игроках начинает тормозить. На чем написан сервер, на php что ли? Или там много математики-физики считается на сервере?
caseyryan
05.04.2013, 15:25
А вообще странно, что у тебя на 10 игроках начинает тормозить.
Ничего странного. Вполне возможно зацикливание сообщений. У меня как-то раз в игре такая хрень получилась, долго не мог понять в чем проблема, пока активное логирование не прикрутил к серверу, и выяснил, что одно и то же сообщение гуляет по кругу. Получалось так: солдат посылает серверу сообщение о том, что он пошел, сервак его принимает и рассылает всем клиентам в комнате (в том числе и тому клиенту, за которым закреплен солдат). Сообщение на клиенте обрабатывалось, и вот тут вступал в действие баг. Вызывалась та же функция Soldier#go(toX:int, toY:int) которая и отсылала сообщение о том, что он должен идти. Отсюда возникал этот бесконечный круговорот. Сервак, каким то чудом справлялся, а вот флеш плеер крашился через 10 - 20 секунд игры. Нервов этот баг помотал немало )
Советую почитать статьи от Valve на эту тему, начать можно с этой, она мне в свое время очень помогла: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking:ru
TurboDizel
14.04.2013, 01:26
А это и есть существующие способы. Например. Средний пинг - не менее 50ти. Это означает, что нет смысла посылать данные чаще, чем 20 раз в секунду. Особенно, если tcp/ip, они только будут скапливаться в буфере.
У тебя же не такие большие объемы данных, чтобы архивировать посылку.
А вообще странно, что у тебя на 10 игроках начинает тормозить. На чем написан сервер, на php что ли? Или там много математики-физики считается на сервере?
Ничего на сервере сложного нет, просто передаются коорты и всё. Сервер на Java (UnionPlatform). Просто так получается, что когда я проверял, много копий игры запускал, и по-мимо той нагрузки, которая сама по себе есть (передача координат), ноут ещё нагружается этими запущенными копиями с десятком игроков в каждой. Поэтому и игра тормозит, и сервер скорее всего, так как он тоже на ноуте ведь). Ну это так, догадки, так как тоже не понравилось, что 10 игроков это предел.
Вполне возможно зацикливание сообщений
С этим с самого начала разобрался, чтобы само себе не отправляло в подобных случаях, так что тут всё в порядке (код небольшой, путаться негде), сервер просто не хочет больше 10 игроков нормально обрабатывать).
Советую почитать статьи от Valve на эту тему, начать можно с этой, она мне в свое время очень помогла: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking:ru
Тут больше конкретно про Source идет речь, немного не то, что искал.
а что вообще сервер делает при получении пакета от клиента?
как выбираются те, кому отсылать надо\ненадо?
работает через сокеты или через http?
caseyryan
14.04.2013, 11:05
С этим с самого начала разобрался, чтобы само себе не отправляло в подобных случаях, так что тут всё в порядке (код небольшой, путаться негде), сервер просто не хочет больше 10 игроков нормально обрабатывать).
Проблема явно в коде. Никакой мистики тут нет. Если сервер и клиент грамотно написаны, то одновременно смогут обслуживаться тысячи игроков
TurboDizel
16.04.2013, 18:24
а что вообще сервер делает при получении пакета от клиента?
как выбираются те, кому отсылать надо\ненадо?
работает через сокеты или через http?
При получении сообщения, сервер отправляет его всем другим подключенным клиентам.
Отсылается всем, за исключением того, кто отправил.
Работает через сокеты.
Проблема явно в коде. Никакой мистики тут нет. Если сервер и клиент грамотно написаны, то одновременно смогут обслуживаться тысячи игроков
Т.е. сервер может обрабатывать 30000 сообщений в секунду (это только при 1000 клиентов)? Просто я даже примерно не знаю, насколько сложно серверу получить и отправить одно сообщение, поэтому и вопрос, нормально ли что в моем случае для него 300 сообщений в секунду это максимум для нормальной работы?
При получении сообщения, сервер отправляет его всем другим подключенным клиентам.
Отсылается всем, за исключением того, кто отправил.
Работает через сокеты.
я не про логику спрашивал, а про реализацию. может вы при каждом обращении грузите под сотню классов, проходите кучу конструкторов и инициализаций, а потом ещё шлете два-три-четыре запроса в базу, только чтобы получить список пользователей, которым нужно разослать ответ?
TurboDizel
18.04.2013, 10:45
я не про логику спрашивал, а про реализацию. может вы при каждом обращении грузите под сотню классов, проходите кучу конструкторов и инициализаций, а потом ещё шлете два-три-четыре запроса в базу, только чтобы получить список пользователей, которым нужно разослать ответ?
Ничего такого нет, пробная флешка практически пустая просто передает коорты всех игроков (игроки обычные мувики).
caseyryan
18.04.2013, 14:14
Ну тогда это просто чудо. Либо сервер по мощности едва превосходит калькулятор )
Обработать 300 сообщений в секунду для нормального сервера - это пустяк.
если он не удаленный и не на GPRS-модеме :)
но разговор вроде был про локальный сервер.
здесь уже только помощь телепатов.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.