Свернуть ↑
Всем привет,позвольте мне потратить пару минут вашего драгоценного времени и рассказать о моей возникшей проблеме
собственно делаю игру и пришел к решению писать свой сервер для mmo, есть конечно и готовые решения но они либо не подходят, либо другие причины.
Перед началом так сказать не легкой работы я решил запастись нужной теорией и подойти к этому серьезно, ведь от того как я реализую структуру взаимодействия клиент-сервер будет зависить многое.
Вот я собрался с мыслями и начал копать теорию, многое просмотрел по поводу архетиктуры mmo серверов, например на торентах есть разбор архитиктуры игры Алоды, многое для себя вынес из их доклада.
Также полазил на тематических форумах и сделал кое какие выводы ,а именно:
Сервер будет следующей структуры:
1.Login Server
1.1 Обработка подключений,регистрация,передача ключа в game server и т.д тоесть все для авторизации. Проверили пустили, или же не пустили, или если регистрируем, проверяем в бд есть ли такой ник, если есть то не регаем, нет заносим новую запись
2.Game Server
2.1 Собственно основной сервер обрабатывающий положение игроков , события, и все все все что с этим связано...
С логин сервером все понятно. Да и game все впринципе понятно, вопрос кроется глубоко внутри...
Дело в том что нужно выбрать протокол, да я согласен врятли мне удастся собрать огромный онлайн но все же, я буду писать с расчетом на онлайн свыше 3000 человек, зачем? все очень просто, это не плохая практика в программировании, и если мне удастся написать такой сервер, то смогу его продовать в будущем, или же использовать сам в своих проектах
И не нужно тролить по этому поводу, а рассмотрим теперь как нам обеспечить игру без лагов когда игроков у нас больше 3000.
Итак, на тематических форумах нашел следующее:
Свернуть ↑
В тесте (50байт*5000юзерей*)*(5000+1) за 5 сек а это 1,192 Гб с нормальной загрузкой ЦП
^размер пакета ^колличество отправленных+принятые
то есть за одну сек - 238 Мб
разберем такую ситуацию
Онлайн танки
Х
30 игроков в руме
размер одного пакета =
позиция 12байт
вращение 12байт(оптимально)
поворот турели 4байт
подьем пушки 4байт
позиция снаряда 12байт
поворот снаряда 8байт(поворот вдоль не нужен)
резерв 8 байт
Итого - 60байт
Х
все сразу передают
(30*60байт)*5000 + (30*166*60) = 8,86 Мб < трафик за сеанс
размер одного передоваемого пакета^ ^Uзверей ^размер получаемых пакетов
(238Мб/сек) / 8,86 = 26,86
1сек / 26,8 = 0.037
то есть насколько я понял пакет можно будет передовать с задержкой 37мс - 50мс
Свернуть ↑Развернуть ↓
Тоесть основные подводные камни кроются в пакетах, передачи и скорости.
Исходя и этого я стал рыть что же лучше подойдет мне, везде советуют ипользовать UDP о нем то я сейчас и читаю на вики
http://ru.wikipedia.org/wiki/UDP
Есть и еще 1 проблема, работая прежде в С# с бд mysql(а сервер будет именно использовать ее) не раз замечал что C# не очень то дружит с ней, всегда использовал mysql connector , и скорость я бы сказал не самая идеальная, или может я что то не так делал... Ну как вам сказать, для простого виндос форм приложения, скорость вполне нормальная, а для сервера, такая скорость записи в бд не пойдет,
Например: Делал простую выборку по базе(проверял существует ли такой emeil приходилось подождать секунду точно, а это ведь всего проверка, а вы представте сколько запросов к бд будет при работе сервера, и т.д)
Что хочется услышать от вас? мнение по этому поводу,а именно: Если бы у вас встала такая задача какой протокол вы бы выбрали ,почему? Как лучше будет работать с mysql. Стоит ли брать C# или же лучше изучать другой язык( я не имею не чего против C# и щитаю что на нем вполне можно реализовать данную задачу, единственное что сервер сможет работать только под Windows, если же его писать например на java(например все пиратские сервера знаменитой lineage 2 написанны на ней) то тогда можно бы было его запускать под пингвином, хотя это не столь принципиально.
Итак, какой же протокол выбрать? как наиболее эфективно передовать данные от клиента к серверу в mmo с наименьшей задержкой и наименьшим трафиком? Стоит ли рыть в сторону UDP? Ведь есть и TCP.
Было бы интересно выслушать ваше мнение по этому поводу)
Спасибо за внимание)