vagrand
7.06.2013 - 00:45
Всем вечер добрый.
Стоит задача спроектировать и реализовать боевую систему по типу как в БК, т.е. грубо говоря есть N игроков, у каждого свой набор параметров и мне необходимо реализовать систему боя между ними. Сейчас думаю над оптимальной реализацией с прицелом на дальнейшее распараллеливание на несколько серверов.
На данный момент есть уже все параметры игроков, которые подсчитаны и лежат в Redis в виде некого набора ассоциативных массивов. Ниже изложу свои соображения по организации боевой системы.
1. На стороне сервера будет работать демон реализованный в виде php shell скрипта. Далее буду именовать его обработчиком. Обработчик можно будет запускать в несколько потоков. При запуске нового потока, обработчик будет "регистрировать" себя в под уникальным идентификатором в некотором массиве, который будет хранится в Redis.
2. В массиве идентификаторов обработчиков каждому из них будет соответствовать число с количеством активных боев, с которыми обработчик в данный момент работает. При начале боя система будет проверять массив обрабочиков и будет выбиратся тот, у которого меньше всего активных боев дабы распределить нагрузку.
3. После выбора обработчика будет создаватся сущьность "бой", которая будет представлять собой массив с данными о игроках, которые в этом бою участвуют, скорее всего будут хранится их идентификаторы и небольшая вспомогательная инфа, например "живой" это игров или NPC. Сущьность "бой" будет так же иметь свой уникальный идентификатор, который будет связан с идентификатором обработчика посредством добавления его в список, который буду хранить в Redis при помощи его внутреннегог типа данны "список".
4. После создания сущьности "бой" будет создана первая из сущьностей "шаг", у которой будет порядковый номер 0 и котрая так же будет хранится в Redis в виде списка с привязкой к идентификатору сущьности "бой". Как можно догадатся всего сущьностей "шаг" может быть от 0 до N. В сущьности "бой" будет хранится идентификатор активной сущьости "шаг". В сущьности "шаг" для каждого игрока будет храниться информация о его действиях, т.е. куда он нанес удар и куда поставил блок и скорее всего надо будет эти действия выделить в отдельные сущьности, что бы избежать колизий с одновременным доступом к одной инфе.
5. Каждому игроку будет даваться некоторое время на каждый шаг, на протяжении которого игрок должен будет выполнить действие и информация о нем сохранится в сущьности "действие". Обработчики будут постоянно мониторить связанные с ними бои и будут отслеживать состояние каждого шага. В сущьности шаг будет храниться так же следующая информация: время начала шага и количество игроков, которые дошли до этого шага. На соновании этих данных, а так же на основании количества уже выполненных дествий каждым игроком обработчик будет принимать решение о том выполнен ли этот шаг на данный момент и приступать к подсчету урона. Будут два условия для завершения шага:
5.1 Когда все игроки, которые принимали участие в этом шаге выполнили свои действия;
5.2 Когда время отведенное на текущий шаг истекло.
6. Для возможности в дальнейшем распараллелить боевую систему на несколько серверов будет добавлена сущьность "сервер", которая будет хранится в каком-то одном сервере и каждому экземпляру этой сущьности будет соответствовать число активных боев на этом сервере. Т.к. бой инициируется всегда одним игроком, то при инициализации будет выбиратся наименее загруденный сервер и всем участникам боя будет приходить информация на какой именно сервере им посылать запросы.
Ну вот примерно и вся архитектура. Общение игрока с сервером будет осуществлятся посредством AJAX запросов.
Интересно услышать мнение сообщества, желательно обоснованное и по существу.
Всем спасибо за внимание и извиняюсь за много буков.
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
это ваш первый игровой проект или вы уже занимались созданием игр?
_____________
Стимулятор ~yoomoney - 41001303250491
vagrand
7.06.2013 - 10:07
Valick
Какое это имеет отношение к обсуждаемой теме?
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
vagrand
7.06.2013 - 14:41
Странно, я думал что тема интересная, но что-то никакой активности не видно.
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
glock18
7.06.2013 - 14:45
Цитата (vagrand @ 7.06.2013 - 10:41) |
Странно, я думал что тема интересная, но что-то никакой активности не видно. |
ну, я просто не знаю, что такое БК
glock18
7.06.2013 - 14:49
Саму игру едва ли понял, но вот
Цитата (vagrand @ 6.06.2013 - 20:45) |
Ну вот примерно и вся архитектура. Общение игрока с сервером будет осуществлятся посредством AJAX запросов. |
это лучше делать посредством websockets
- не требуется обрыв соединения после каждого сообщения
- возможна отправка сообщений сервером клиенту, что снимает необходимость бомбить сервер аяксовыми запросами каждые n секунд.
vagrand
7.06.2013 - 14:55
glock18
Цитата |
ну, я просто не знаю, что такое БК |
Цитата |
это лучше делать посредством websockets - не требуется обрыв соединения после каждого сообщения - возможна отправка сообщений сервером клиенту, что снимает необходимость бомбить сервер аяксовыми запросами каждые n секунд. |
С одной стороны да, а с другой нет. Ведь если я раз в 30 секунд скажем буду посылать один запрос серверу то в варианте с websockets мне конект нужно занимать все 30 секунд.
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
glock18
7.06.2013 - 15:09
Цитата (vagrand @ 7.06.2013 - 10:55) |
С одной стороны да, а с другой нет. Ведь если я раз в 30 секунд скажем буду посылать один запрос серверу то в варианте с websockets мне конект нужно занимать все 30 секунд.
|
ну, нагрузка на сервер меньше, чем при открытии нового соединения каждый раз. Плюс раз в 30с запрашивать обновления (я так понимаю, ходы других пользователей в том числе), то мб это уж слишком медленно будет?
glock18
7.06.2013 - 15:10
Там ведь, наверно, захочется чат какой-то добавить. Для чата вообще websockets обязательное решение
vagrand
7.06.2013 - 15:18
Цитата |
ну, нагрузка на сервер меньше, чем при открытии нового соединения каждый раз. |
Дело не в нагрузке, а в лимите одновременно открытых соединений.
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
glock18
7.06.2013 - 15:22
Цитата (vagrand @ 7.06.2013 - 11:18) |
Цитата | ну, нагрузка на сервер меньше, чем при открытии нового соединения каждый раз. |
Дело не в нагрузке, а в лимите одновременно открытых соединений.
|
Дело ваше. На мой взгляд, все не так однозначно здесь. К тому же если нагрузка от 1 соединения настолько мала, что при 400-500 соединения сервер будет почти ненагружен, то можно попробовать несколько истансов сервера запустить на разных портах. Навскидку такое должно проканать.
vagrand
7.06.2013 - 15:26
glock18
Я не утверждаю что сокеты не применимы в данном случае, это надо тестить. Меня больше интересует алгоритм архитектуры серверной.
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Цитата |
Странно, я думал что тема интересная, но что-то никакой активности не видно |
Вы сами эту активность пресекаете отвечая вопросом на вопрос. Мягко говоря не по-русски это.
_____________
Стимулятор ~yoomoney - 41001303250491
vagrand
7.06.2013 - 19:20
Valick
Я предлагал обсудить техническую реализацию архитектуры, а не мой опыт в подобных проектах.
И потом по моему мнению я ничем вас не обидел, а всего лиш задал встречный вопрос.
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Быстрый ответ:
Powered by dgreen