![]() |
Ответ: Epica online
Цитата:
|
Ответ: Epica online
пахомыч, не соглашусь с твоим советом.
реально нужно 2-3 потока на ядро процессора, никак не больше. |
Ответ: Epica online
Цитата:
Плюс, ещё различные рутинные функции, лучше сделать потоком, если они нужны периодически, просто отправляется поток в сон, и выполняется рутина время от времени? Я сам как бы не знаю, может это и имеет плохие стороны, но для меня очевидно удобно. Если есть тут "подводные камни", подскажите. |
Ответ: Epica online
Цитата:
Вот тут читал по реализации серверов: http://msdn.microsoft.com/ru-ru/library/dd335942.aspx Вот что написано про однопоточную систему: Цитата:
|
Ответ: Epica online
Цитата:
1. создает 2 системных потока на ядро: один для ввода/вывода (сеть, диск), второй для логики 2. в эрланге процессы легковесные (легко запустить 100500 процессов, даже 300000 не проблема вовсе), в отличии от дотнета. |
Ответ: Epica online
из статьи "про доднед и сокеты":
Цитата:
на эрланге поставлен рекорд с 1000000 (прописью: ОДИН МИЛЛИОН) одновременных TCP/IP соединений. |
Ответ: Epica online
Да и компилятор эрланга заточен под это. Но что делать при использовании не Erlang в качестве ЯП для программирования сетей?
Вообще в статье не сказано про то, какая машина у него, сколько памяти и т.д. |
Ответ: Epica online
просьба модераторам вынести часть обсуждения в отдельную тему, и я с удовольствием продолжу.
тут вообще-то тема обсуждения онлайн-игры Epica Online |
Ответ: Сетевая часть ММО игр
Продолжаем
|
Ответ: Сетевая часть ММО игр
Существует так называемая "проблема 10000 соединений"
Подробно описана вот здесь: http://www.kegel.com/c10k.html Вот хорошее "содержание" (взято отсюда) Цитата:
Подходы, в которых используется мультиплексирование ввода/вывода (select) имеют линейный рост времени обработки от числа подключений (чем больше - тем более медленно). Подход вида "1 клиент - 1 поток" тоже нежизнеспособны, так как 1 системный поток требует 1 мб оперативной памяти. Легко посчитать сколько RAM необходимо для 100 000 подключений. Есть только несколько технологий, которые позволяют преодолеть этот барьер. Это kqueue/epoll (linux/freebsd), io completion port (windows server). Для их работы хватает одного потока. |
Ответ: Сетевая часть ММО игр
2ffinder Ты кстати обещал статью по эрлангу написать ;) Я с удовольствием почитаю :)
UPD: ставлю Eclipce и erlide, буду иногда пробовать эрланг по мере возможности |
Ответ: Сетевая часть ММО игр
я бы тоже почитал что нить про эрланг от булочника
|
Ответ: Сетевая часть ММО игр
Цитата:
|
Ответ: Сетевая часть ММО игр
Цитата:
|
Ответ: Сетевая часть ММО игр
Цитата:
Но, неупорядоченная доставка пакетов и нет контроля доставки с последующей перепосылкой. Но там где нужна гарантированная доставка пакетов: чаты, магазины (внутриигровые) - нужно либо изобретать tcp поверх udp, либо... |
Ответ: Сетевая часть ММО игр
+1, да можно и на юдп навернуть свою систему уведомлений и перепосылок !! Но вопрос в другом а стоит ли ??
Если игра не динамичный шутхер то лучше не "чудить" а брать сразу тсп !! |
Ответ: Сетевая часть ММО игр
На деле, udp с механизмом уведомлений по скорости будет то же самое что и tcp, при этом количество клиентов будет не превышать нормальную архитектуру, ту же IOCP к примеру.
|
Ответ: Сетевая часть ММО игр
Добрался до PureBasic`a, начал переносить сервер с блица, все вроде норм, но есть несколько вопросов:
1. Пробую мультитреадинг. Наверно поставлю в отдельных тредах процедуры логина, обработки игроков и обработки монстров (3 треда). Вопрос насчет базы данных, надо ли синхронизировать треды, например чтобы не было одновременного доступа к БД? 2. Нормально ли будет, если я например информацию о нужном в данный момент предмете буду запрашивать из БД, или стоит информацию о предметах подгружать в память (переменные, массивы) при старте сервера? 3. Использую SQLite базу данных. Друзья подсказывают, что в некоторых случаях она быстрее MySQL. То что к ней не будет доступа например с сайта для меня не проблема. Что скажут по этому поводу булочники?:) Какая БД лучше? |
Ответ: Сетевая часть ММО игр
1/2. Вообще доступ к БД, должен выполнятся редко. И может быть с разных потоков. Логика по сути не должна к БД относиться вообще, т.к. её задача - обработка логики.
Менеджер информации, должен отвечать за то что должно быть загружено в ОЗУ, а что нет. Логика работает с данными из ОЗУ, значит они должны быть загружены. Например вещи выставленные на аукцион - должны быть в ОЗУ. При их покупке и т.п. естественно обновлять БД и т.п. Но не выгружать из ОЗУ. Тут важно понимать, что должно использовать данные и от куда. По идее, бд - лишь для хранения данных, но никак не для логики и т.п. Всё должно быть в ОЗУ. Те же мобы, они вообще никакого отношения к БД например не имеют. Либо те же вещи, они почти везде и всегда будут в ОЗУ, таким образом нету никаких ссылок к БД. Вынеси загрузку из БД в отдельный механизм. Например шмотьё, есть вещи, с которыми может взаимодействовать только персонаж который их имеет, например баночка. Держать эту инфу не нужно в ОЗУ, если этот персонаж не в игре. Если он в игре, то грузить всё с ним связанное. При этом есть такой момент, вещь может принадлежать игроку, но быть на том же аукционе, таким образом с ней могут взаимодействовать. Получается она должна быть в ОЗУ всегда, даже если её владелец не онлайн. А это реализуется простым списком вещей для аукциона, который есть в БД и в ОЗУ. Таким образом если вещь купили, то её нужно изъять у игрока который был владельцем, если он оффлайн, это делается через БД, и тут нужно быть уверенным что он сейчас не заходит в игру, чтобы не возникло конфликтов, изъятия его шмотки и загрузка её же. По сути, каждая шмотка также имеет уникальный ID, и т.к. она была куплена другим, то тут тупо при загрузке, нужно проверять, не загружены ли эти вещи уже в ОЗУ, если да, то не грузить и т.п. Там куча условий и сценариев на которых можно наколоться. Поэтому нужно организовать работу с БД и данными в ОЗУ, очень корректно и как весьма мощный механизм. 3. Раньше склонялся к MySQL, но сейчас использую везде MSSQL, намного шустрее выходит, и удобнее с ней работать. Плюс удобный манаджер (визуальный), и другие плюшки относительно самого Query языка. |
Ответ: Сетевая часть ММО игр
Цитата:
Цитата:
|
Ответ: Сетевая часть ММО игр
Кстати кто может сказать, для серверной части критичным будет использование LINQ to SQL например? Я вот подумываю попробовать для старта использовать компилируемые LINQ запросы. Если уж производительности не хватит - то перевести серверную часть на обычный ADO.NET.
Просто сейчас критичным является срок разработки... |
Ответ: Сетевая часть ММО игр
Вложений: 1
Подскажите кто что думает вот о такой архитектуре. Если есть комментарии/замечания, то буду очень рад:
Вложение 13810 Оговорюсь сразу - MMO подразумевается по ходовое. |
Ответ: Сетевая часть ММО игр
как по мне - решение имеет право на существование !!
:ok: |
Ответ: Сетевая часть ММО игр
Ну может есть у кого предложения по улучшению, лучшей организации или какие-то рекомендации? У меня опыта в MMO - 0%) я даже в них практически не играл )
|
Ответ: Сетевая часть ММО игр
Что такое Realm?
В моём понятии это сервер, что имеет свою DB и свою независимую игровую логику. Это в случае если предусматриваются разные сервера, для разделения игроков, возможно по режимам игры (PvP/PvE или т.п.), также они естественно могут иметь разные настройки, и возраст, который будет определять уже общий коэфицент развития игроков в игровом мире. Получается нужно иметь отдельный сервер, что будет иметь DB всех учётных записей, также этот сервер будет отображать статус realm'ов, и т.п. Когда user заходит в Launcher, он логиниться под его учётной записью, затем ему выдаётся список серверов, и их статусы. Он выбирает realm на который заходить, на этом моменте он устанавливает соединение с выбранным сервером, и далее уже получает список персонажей. При выборе персонажа, идёт уже загрузка в мир, исходя из локации, и т.п. По сути, первый сервер, имеет ответственность за авторизацию игровой копии (если такое предусматривается), а также аутентификацию учётной записи. Также, при соблюдении всех проверок, и выборе реалма, должен создаваться временный ключь сессии, на этом же сервере. Который будет запрошен и сверен с предоставленным от клиента. То есть: при выборе realm'а, на сервере учёток создаётся уникальный ключик (хашь хрени всякой), шлётся пользователю, пользователь с этим ключём посылает запрос на realm, который в свою очередь ищет по этому ключику сессию на учётном сервере, находит, и таким образом, он знает уже какой пользователь (учётка), и т.п. соединяется. Этот ключик сессии, должен быть деактивирован каждый раз при дисконнекте, и он же будет участвовать в проверке попытки зайти два раза тем же персонажем, и для логов. Учётный сервер, сильно отличается от игрового. Игровой сервер уже будет осуществлять всю игровую логику. Далее, технически, нужно иметь статус состояния клиента на сервере, исходя из которого, будут ожидаться те или иные пакеты с данными. Так сказать, инкапсулировать логику на приём пакетов, которые не должны ожидаться. Учти, что внезапный обрыв клиента, должен быть ожидаемым в любой момент, и с этим придётся считаться, чтобы "замести" все следы недоделанных работ. Работа с БД, должна также быть весьма отделённой от игровой логики. Почти вся игровая логика должна быть завязана на данных в ОЗУ, а менеджер загрузки данных, должен грузить и выгружать чётко что нада а что нет. Тут будет много парки с утечкой памяти. Также, учитывай, что сервер может вдруг упасть, все данные, будут потеряны (те что в ОЗУ), и с этим нужно тоже считаться.. |
Ответ: Сетевая часть ММО игр
Спасибо за комментарий!
Realm - это игровой мир, я не думаю что они будут различаться функционально, просто несколько миров или один и тот же мир. Про утечки памяти я не боюсь, C# ведь ) самое главное сделать оптимальным работу сборщика мусора, здесь самое тяжелое - сериализация пакетов. На клиенте я создал постоянный буффер для сериализатора, а вот на сервере для параллельной сериализации наверное придется либо делать некоторое количество буферов... не хочется чтобы на сервере сборщик мусора тоже воевал... Вот я не думал что для всех серверов стоит разделять базу данных... сейчас что-то задумался... |
Ответ: Сетевая часть ММО игр
Если это отдельный мир, и игрок имеет возможность зайти тем же персонажем на другой realm, тогда разделять БД не нужно на realm'ы.
Либо если это организовать грамотно, тогда будет выгода, т.к. количество записей в таблицах будут в разы меньше, т.к. делены на realm'ы, но нужен тогда сервис транспортировки туда-сюда. Вот интересно то что в том же WoW, есть Battleground'ы, это типо становишься в очередь, далее сервер ищет команды 10 либо 15 либо 30 (зависит от бг), и затем когда начинается игра, запускается бг, но прикол в том что игроки на бг, с разных серверов, а не с того же. Таким образом за БГ, отвечает отдельный сервер, который собирает инфу с разных бд серверов. Но там всё сложно, там целые cloud'ы в дата центрах, там всё реально сложно ;) Хотелось бы знать больше о ТЗ, относительно учётных записей пользователя, realm'ов, и самих персонажей.. |
Ответ: Сетевая часть ММО игр
Да пока больших ТЗ нет. Просто конструирование обобщенной архитектуры.
|
Ответ: Сетевая часть ММО игр
Также, соединение/отсоединение, не должно иметь важных процессов, т.к. нормальное соединение/отсоединение на основе сообщений "игрок_выходит" и типо того, они не обязательно будут всегда. Я могу тупо сделать Clt+F4, такие образом нужно меньше всего зависеть от наличия игрока подсоединённого. Это говорит также о разделении самого клиента с точки зрения сети, так и клиента, с точки зрения игровой информации.
Мыслей куча, большинство конечно будут весьма очевидными, но если будут конкретнее вопросы, то с радостью поделюсь размышлениями. ЗЫ, сейчас свой ассинхронный сокетный сервер, переписываю :) Хотел реализовать повторное использование сокета, не удалось, он остаётся заbind'еным, а это не позволяет снова его использовать.. :( Если стретитесь с этим, буду рад услышать про это. Также сделал в локальной сети стресс тест, запустил сервер, на простеньком компе (4гб рама, старый проц), и далее на трёх разных компах запустил по несколько клиентов. Каждый клиент создавал каждый 2мс подключение к серверу, всего он делал 1000 подключений, и затем, каждые 100мс, он слал с каждого подсоединения по 1 биту. Сервер же, принимал подключения и ставил сокеты на прослушку, принимал сообщение и продолжал слушать каждый подключенный сокет. Также в течении секунды рассылал всем по 1 биту пакет. В итоге, я позапускал около 20 клиентов на трёх разных компах. Сервер выдержал без проблем 20 000 подключений, и слал пакетики. Проц вообще не грузило, когда все были подключены. :) |
Ответ: Сетевая часть ММО игр
Первый вариант асинхронного клиент-сервера с бинарной сериализацией пакетов заработал успешно )
Будем дальше пробовать сеть программировать. Начнем с сервера получения игровых сессий. |
Часовой пояс GMT +4, время: 02:30. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot