|
58 / 24 / 6
Регистрация: 26.09.2010
Сообщений: 241
|
|
Решил сделать свой асинхронный многопоточный сервер31.12.2016, 11:38. Показов 4483. Ответов 10
Метки нет (Все метки)
Итак. Цель создать асинхронный многопоточный сервер для MMOFPS (онлайн шутер от первого лица) на C#.
Соответственно план такой: 1) Сервер должен быть асинхронный на сокетах 2) Выдерживать одновременно 2500-3500 подключений 3) Думаю использовать несколько потоков: первый - слушать подключение новых клиентов или отключение существующих, периодически пинговать не отвалился ли клиент; второй - принимать/отправять пакеты; третий - серверная игровая логика. (может быть совместить со вторым?); четвертый - работа с БД; 4) Масштабируемость сервера. Как и за счет чего осуществить? Предполагаю не использовать Socket.BeginAccept, так как этот метод вроде как медленный, это так? Какие есть еще варианты? Хотя на самом сайте майкрософта это как раз используется в примере https://msdn.microsoft.com/ru-... .110).aspx Как избежать использования while(true){} ? Прокомментируйте что я в плане написал правильно, а что нет. В общем, помогайте)))
0
|
|
| 31.12.2016, 11:38 | |
|
Ответы с готовыми решениями:
10
Асинхронный и многопоточный - одно и то же?
Найти ошибки, которые не дают сделать асинхронный сервер |
|
58 / 24 / 6
Регистрация: 26.09.2010
Сообщений: 241
|
||
| 31.12.2016, 12:09 [ТС] | ||
|
0
|
||
|
|
|
| 31.12.2016, 12:30 | |
|
Sergio-X86,
1) Определитесь какой сетевой протокол вы собираетесь использовать. Вы сходу взялись за TCP как я понимаю. Хотя обычно для таких задач используется UDP. 2) Разработайте протокол обмена. Он должен минимизировать траффик и в то же время передавать достаточно информации для однозначного позиционирования игрока. 3) Разработайте модель интерполирования. Как для движения игрока, так и для выстрелов. Для затравки почитайте например здесь https://habrahabr.ru/post/135306/ (первое что попалось в гугле, специально не отбирал) 4) Забудьте про 3500 игроков онлайн. Вообще. Навсегда. Это не реально в шутере. Настройтесь на 20-30 игроков максимум. 5) Забудьте пока про потоки. Потоки в последнюю очередь. Да и про БД тоже забудьте... Какое БД в шутере? БД годится максимум для того, что бы запоминать количество фрагов. 6) Ну а так, да, Socket.BeginAccept подходит
0
|
|
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
|
| 31.12.2016, 12:48 | |
|
Класс SocketAsyncEventArgs
High Performance .NET Socket Server Using Async Winsock C# SocketAsyncEventArgs High Performance Socket Code
0
|
|
|
58 / 24 / 6
Регистрация: 26.09.2010
Сообщений: 241
|
||
| 31.12.2016, 14:40 [ТС] | ||
|
2) Протокол обмена я разработаю, есть реальный опыт работы с этим. 3) С этим тоже смогу разобраться, хорошая статья. 4) Шутер MMOFPS с "открытым" миром, так что нужно именно такое количество подключений. Ну и с прицелом на будущее использовать сервер для MMORPG. Я понимаю, что есть факторы, когда может в одном месте собраться и 7000 игроков, но уже второстепенная задача. 5) Ок. Разберусь сначала с коннектом/обменом информацией. Самая важная для меня задача, в которой я пока не компетентен, это подключение к серверу большого количества клиентов, получение/отправка пакетов, обработка их (ну с этим понятно более менее), слежение за тем подключен ли клиент. При этом на сервере будет проверка коллизий, проверка и управление открыванием дверей, и прочих механизмов.
0
|
||
|
11 / 11 / 11
Регистрация: 08.07.2013
Сообщений: 43
|
|
| 31.12.2016, 22:14 | |
|
Не просто так делают залы по 18-20 человек, в современных MMOFPS используется и TCP, и UDP.
TCP для взаимодействия с UI, создание залов, чат. UDP для передвижения по карте, стрельба. Про 7000 можете забыть сразу, тем более на c#, необходимо будет поднять несколько серверов. Про архитектуру MMORPG можете почитать на хабре, там есть ряд интересный статей, например от разработчиков Mail.Ru.
0
|
|
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
||||||||||
| 31.12.2016, 22:20 | ||||||||||
|
Пара неочевидных общих (будут варьироваться от задачи) вещей: - Сообщение должно содержать размер, тип (опкод) и номер в очереди (или его аналог). Опкод - это целое число, уникальный идентификатор действия, которое было совершено. - Сообщение должно влазить в размер пакета. Об игроке отправляется не все состояние, а только какое-то одно крошечное и определенное (текущая позиция например, три целых числа). - Сообщение должно быть максимально маленького размера. Медленная и кривая стандартная двоичная сериализация здесь не подойдет. Вообще не подойдет что-угодно, связанное с рефлексией. Сообщение должно сериализоваться/десериализоваться очень быстро и при этом весить очень мало. Например есть такой тип base 128 varint, который меняет свой размер в зависимости от размера данных, которые в нем содержаться. Проще говоря в простом случае число 5 занимает 1 байт, а число 12345 - 2 байта. В сложном случае применяется например еще ZigZag кодирование - это когда -12345 тоже весит 2 байта. - Текст по возможности лучше вообще не помещать в сообщения. В противном случае использовать ASCII или целые коды. Для чата лучше использовать отдельный чат-сервер и никак не валидировать на валидность сообщения. - В сообщениях только информация о событиях и никакой графики, звука, текстов и подобной медиа. - Сообщение, когда приходит, становится в очередь, а не сразу же в этот момент обрабатывается. Пока думаю хватит. Этот список можно увеличивать до белого каления. Не говоря о способностях сервера выдерживать этот ддос. Например, хорошая практика использовать компонентно-ориентированное программирование вместо ООП. Имеется ввиду никаких ссылок и наследования. Наследование - это операции над виртуальной таблицей типов, что плохо для производительности, особенно когда иерархия большая; с другой стороны композиция намного лучше наследования для реализации механик игры. Ссылки плохо влияют на производительность и эффективность размещения данных в памяти, лучше использовать указатели, а еще лучше использовать простое число ID и менеджер контента, который умеет искать объект по его ID. Довод: не будет в коде строк вида Player.Info.DetailInfo.SomeSpecificInfo.SomeValue.SomeValue2.SomeValue3...SomeValueN (пример утрирован, на самом деле все еще хуже получается, так как надо еще как минимум кастить к нужному типу), которые очень сильно просаживают производительность, учитывая что это еще и свойства, к которым долгое обращение.Преждевременная оптимизация - дорога в ад. Нужно сперва написать прототип, который будет худо-бедно держать 5 пользователей и гонять 25 Гб траффика в час в виде JSON/XML, а потом уже пытаться его оптимизировать. К тому моменту будет уже список основных проблем и варианты их решения, основанные на интеграционных тестах, а не "построение несуществующего дома из несуществующих палок".
0
|
||||||||||
|
58 / 24 / 6
Регистрация: 26.09.2010
Сообщений: 241
|
|
| 31.12.2016, 23:12 [ТС] | |
|
Спасибо всем за понятные развернутые ответы! Теперь более менее понятно в какую сторону двигаться. Если кто-нибудь допишет еще рекомендации буду только рад =)
0
|
|
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|
| 01.01.2017, 00:41 | |
|
напиши для начала крестики-нолики, чтоб была 100% стабильность всех действий игрока и очередность
считаешь себя крутым, хочется хардкора - крестики-нолики, но добавь drug&drop чтоб другой игрок мог видеть в реальном времени перемещение твоего крестика/нолика (без лагов по вине кода) этих 2 задач более чем достаточно чтоб успокоится и либо стать экспертом, либо забить на сетевые игры в принципе
0
|
|
|
58 / 24 / 6
Регистрация: 26.09.2010
Сообщений: 241
|
||
| 01.01.2017, 01:09 [ТС] | ||
|
Еще, я в онлайн шутере в Стиме сделал полноценный режим с закладкой и разминированием бомбы как CS:GO, а также зомбимод + много доработок в готовых режимах деафматч и классическая контра. Поэтому с пакетами, и минимизацией траффика работать умею. Само собой с авторизацией клиента на сервере работал, в том числе с использованием PHP+MySQL. А вот в часть, где происходит подключение сокетов я не лез, так как все вполне неплохо работает. Но мне свое надо, надо дальше расти, изучить и эту часть серверных технологий. И как-то C# больше по душе чем C++.
0
|
||
| 01.01.2017, 01:09 | |
|
Помогаю со студенческими работами здесь
11
Решил сделать локальный TCP прокси-сервер. Как делать переадресацию? Как сделать свой сервер? Как сделать свой почтовый сервер на PHP?
Я решил Задачу на Произвольную Пространственную Систему Сил, решил систему из 5 неизвестных, КАК СДЕЛАТЬ ПРОВЕРКУ РЕШЕНИЯ ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|