Шрифт
Как написать реал-тайм онлайн игру? Методология, паттерны, статьи?
Play

Как написать реал-тайм онлайн игру? Методология, паттерны, статьи?

Писать буду серверную часть на c++ (решение может изменится в сторону nodejs в силу наименьшего порога синтаксиса), но меня больше интересует не столько тонкости самого языка как способы и приемы.

Меня интересует методология и паттерны для создания логической структуры реал-тайм онлайн игры. Это поможет мне взять быстрый старт и обеспечить легкую пост разработку и поддержку. Не хочу наступать на грабли, создавая колеса, поэтому прошу вас помочь мне разобрать азы.

Я думаю стоит рассматривать вопрос в слоях, поэтому я решил разделить интересующий меня вопрос на подпункты:

1. Как лучше открыть сокет? 2. Какие данные лучше всего передавать по сокету и в каком виде? (наименьший размер, перфоманс) 3. Что хранить в оперативной памяти сервера, что хранить в базе данных? 4. Какая база данных лучше подойдет? SQL / noSQL / Реляционная / Объектно-реляционная? 5. Имеет ли смысл использовать кеширование? Или сойдет оперативная память + БД.

С уважением, искатель приключений.

  • Вопрос задан более трёх лет назад
  • 10305 просмотров

Оценить 4 комментария

  • Facebook
  • Вконтакте
  • Twitter

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

По БД: для разных данных нужны разные подходы, может оказаться, что нужно несколько разных.

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

Вы задаете более-менее правильные вопросы, но на них нет правильных ответов. Каждый случай очень индивидуальный и кратким ответом тут не обойтись, тут нужны лекции с тоннами теории. Я в свое время писал игры: php (api) + flash (клиент) + C++ (сервер) + mysql (база данных) + memcache (кеш), php (api) + python gevent (сервер) + mongodb (база данных) + redis (кеш) + html5 (клиент), nodejs (сервер) + html5 (клиент) + redis (кеш) + postgresql (база данных). Все они были довольно проивзодительными. Такое разнообразие технологий отчасти обуславливалось моим любопытством (проект на nodejs писал для себя). В целом пытаясь ответить на Ваши вопросы: 1. Не совсем понятно что Вы имеете ввиду. Уточните вопрос. 2. Лучше всего передавать на сервер все действия клиента и обсчет производить на сервере для невозможности подделывания результатов действий, но это приводит к возрастанию нагрузки на сервер. Протокол - мне нравится bson с готовыми библиотеками, понятным форматом и небольшим размером. Но опять же его я использовал только во втором проекте, в остальных местах я создавал свои велосипеды, которые для конкретных случаев были наиболее эффективны (в моем представлении) 3. В базе хранить все, что не должно пропадать между играми (условно говоря после выключения сервера ;)), в оперативной памяти дублировать все в идеале (для избавления от операций чтения с диска). 4. Зависит от потребностей. Postgresql\mysql - более традиционны. Mongodb - модная ) Если Вы понимаете, что в Вашей игре вы можете пережить ограничения mongodb (к примеру отсутствие транзакций) - юзайте его, очень удобен для хранения игровых состояний. Если не уверены - используйте традиционные реляционки. 5. Кеширование по сути и есть перемещение данных из БД в оперативную память. Причем перемещается таким образом, что скорость выборки из оперативной памяти не зависит от количества данных. Это так называемые хэш-таблицы.

В общем, без обид, но судя по Вашим вопросам Вам надо очень серьезно подтянуть теорию, прежде чем браться за серьезную игру. Писать серверную часть на С++ - круто, если Вы его знаете на отлично. В целом большого профита Вы не получите, так как скорость С++ проявляется в числодробилках. А игровой сервер - в основном операции чтения\записи, которые будут одинаково выполняться на практически любом современном языке и их скорость больше зависит от построенной архитектуры. Мои рекомендации: читать про блокирующие\неблокирующие сокеты, многопточность, структуры данных, паттерны проектирования, оптимизация запросов (включая нормализацию и денормализацию данных), кеширование. Параллельно с этим можно делать простенький чатик постепенно улучшая и оптимизируя его. Таким образом Вы приобретете и теорию, и практику. После этого можно сделать какую-нибудь простенькую игру.

📎📎📎📎📎📎📎📎📎📎