Простроение большой программы.

Доброго времени суток!
Для начала, хочу сказать большое спасибо, за понятные уроки по с++! Во многом действительно очень помогли в плане понимания языка, но спросить хочу немного о другом.
Я начинающий кодер, но с большими амбициями :) в частности собираюсь писать собственную он-лайн игру. Да, я понимаю, что звучит смешно и наивно, но уверяю вас, весь масштаб катастрофы я полностью осознаю и буду собирать для этого дела свою команду. Лично мне программирование нужно скорее для понимания готового кода и что б не совсем уж быть дубом, как многие геймдизайнеры, фонтанирующие безумными идеями.
Собственно мой вопрос по логике построения ООП приложений.
Пока всё определяется малыми масштабами — ясность есть, но как быть с многоуровневыми и сложными приложениями? К примеру, я начинаю писать игру с функции main. Далее идёт разбиение на классы, библиотеки и т.д., но вот вопрос, что должно остаться в main, что б не перегружать сервер? Т.е. допустим, персонаж может просматривать информацию о себе(инвентарь, статы и т.д.), воевать с кем-то, путешествовать по локациям, торговать, и делать еще сотни и тысячи действий совершенно разного плана. Допустим на каждое действие у меня будет выведен отдельный класс в отдельном файле: отдельно на вызов и взаимодействие с инвентарём(с соответствующим подклассами), на боевой режим, на торговую операцию... но, в итоге-то может получиться так, что мейн будет дико перегружен различными циклами и свичами!? Т.е. в утрированом варианте, на плечи главной функции ляжет обязанность переключения между кучей файлов с классами и другими функциями, не говоря уже о куче доп. проверок на пересекаемость действий(например, что предпринять, если на персонажа напали в момент просмотра инвентаря или торговли?). Не получится ли так, что функция мейн постоянно ожидая каких-то действий от пользователя или воздействия на персонажа со стороны других объектов, начнёт отжирать нереально огромное количество ресурсов компа? И как решаются такие вопросы? паузой на работу до появления нового события? или таймер реакции, который будет проверять изменения раз в секунду реагируя на них с задержкой?

И второй вопрос: подскажите пожалуйста, хотя бы в упрощённом варианте, как осуществляется связь между клиентом игры и сервером? Какие нужны инструменты и знания для этого? Как всё это происходит на уровне общения между этими крайностями? И как сервер умудряется справляться с миллионами запросов в минуту, хотя бы при обработке 1000 пользователей-игроков?

Т.е. в целом, я могу себе представить, как выглядит взаимосвязь одного сервера с одним клиентом: путём последовательного выполнения программы мейн для него, как если бы всё это происходило на одном компьютере. А если пользователей становится 2? Как таже функция мейн на сервере понимает, что относить к действиям первого игрока, а что к действиям второго? Ну в самом деле, не разворачивать же на сервере отдельный код для каждого нового пользователя? или... всё же разворачивать? Т.е. будет функция мейн для игрока1, такая же для игрока2, игрока3 и т.д.? Которые будут загружаться при логине персонажа в игру и удаляться при выходе из неё(разумеется, предварительно сохранив все данные о произошедших изменениях в базу)? А как при этом будет осуществляться работа подклассов? Т.е. игрок1 начал сражение, соответственно воспользовался функцией отвечающей за развёртывание боевой карты, но тут и игрок2 тоже попал в бой и та же функция начнёт применятсья к нему, так как эта функция поделит запросы от разных пользоваталей, совершающих разные действия?
Понимаю, что очень сумбурно написал, но мне не требуется сейчас подробных примеров с кодами и т.д., меня интересует понимание функционала как такового, что б было правильно и экономично для ресурсов сервера, компа пользователя и трафика.
Заранее спасибо за помощь!

И таки этот человек говорит, что полностью осознает масштаб катастрофы?

И таки этот человек говорит, что полностью осознает масштаб
катастрофы?

таки да :) в основном я геймдиз, но геймдизу так же нужно знание и понимание того, что будут/могут сделать его коллеги. Я нахватался знаний из разных областей за последние 2 года, необходимые для создания и руководства он-лайн проектом. Это и с++, и sql, и js, юридические вопросы, и бухгалтерия, и ценовые вопросы по аренде серверов, разумеется и геймдизайнерство и принципы и современные тренды игростроя и ещё кучу всего, не говоря уже о многотомнике концепта игры с сотнями формул, таблиц, графиков и т.д.
Но, програмистика даётся тяжелее всего, поскольку в основах был только годовой курс ООП в институте почти 15 лет назад. Из которого, если уж говорить честно, я мало что понял. Сейчас навёрстываю, но, что б свести в единую систему знания по синтаксису, алгоритмике, и т.д. конкретного языка, требуется для начала абстрактное понимание процессов. Так проще поставить самому себе задачу, что изучать дальше и к чему готовиться. Вот в этом абстрактном понимании мне и нужна помощь. Куда ни зайдёшь, везде пачка ссылок по теории сетей, пакетам, трафику и т.д. Ни к чему не привязаные, ни о чём мне не говорящие. И тем более нет связи, что де, вот код сервера, вот бд, вот клиент, вот так и через туды осуществляется взаимодействие так и вот так. Потому и задаю вопрос на этом ресурсе, что тут руководства с конкретными примерами, где и в каком случае актуально то или это, так что, есть надежда, что и на мои вопросы я могу ожидать аналогичные, конкретные ответы. Ну, а нет, так нет, разберусь сам, только времени угрохаю многократно больше, чем если буду иметь чёткий план по самообразованию.

И таки этот человек говорит, что полностью осознает масштаб катастрофы?

К чему такие сообщения, если не знаешь, что ответить по теме, так зачем придираться с глупыми шутками?

Не важно на сколько файлов и библиотек ты разобьешь свой main — это влияет только на удобо читаемость кода и удобство его изменения, тесть если изменение одного модуля не влияет на остальные то изменив его не нужно менять другие. Насчет отжирания ресурсов, игра требующая макс. FPC так и пишется, по максимуму, без всяких таймеров и ожиданий. Не дать отожрать все время CPU твоей программе не даст система, если конечно не дать ей приоритет Real Time. Но тогда задумается система, а твоя программа от нее зависит. Но я не об этом, ведь у тебя программа одно поточная, и время выделяемое ей процессором не зависит от ее размера и количества файлов и количества кода в них.
Вот программ отжирающая время CPU по максимуму, столько же сколько и твой main, хотя кода в ней кот наплакал.

#include <iostream>
#include <cstdlib> // для system
using namespace std;

int main()
{
    int a =0;
    while (true)
    {
        a++;
    }
}

Другое дело много поточность (Погугли планирование потоков).
Провел эксперимент, Запустил много выше перечисленный программ в Real Time, моделируя много поточность программы с потоками нагружающими проц. по максимуму, система начала подтормаживать с запуском 7го потока. При запуске с средним приоритетом тормоза появились при 8ми потоках.
CPU восьми ядерный.

Да кстати погугли: «Приостановка процесса». И ты поймешь весь механизм ожидания. В самой программе ждать события в цикле нельзя, как у меня выше, если вписать вместо a++; ожидание какого либо события, процесс все равно будет грузить CPU по максимуму. Но если ты считаешь, что твоей программе больше нечего ждать, то она может уступить свое время другим программам. И когда твоя программа после этого проснется решает не она а система. По этому так поступают только когда ожидают освобождения каких либо ресурсов. И если ты в своей онлайн игре будешь не обдуманно так всем уступать, то твои потенциальные клиенты устанут находится в ожидании реакции твоей программы на их действия. В общем ты их тоже уступишь другим ресурсам. Кстати пример: ты ожидаешь события из сети его нет и ты уступаешь время другим процессам. Только уступил, произошло событие, а твой процесс получил время на выполнение только спустя, какое то время. И отреагировал уже с задержкой, плюс время задержки, передачи данных по сети и вот и разсинхрон и лаги.

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

В таких случаях я всегда задаю ряд вопросов.
А на кой черт ты сдался этой команде?
Что ты можешь ей дать полезного?
А команда будет работать за денюшку или на энтузиазме?
А если на энтузиазме, то кушать на что покупать?

К примеру, я начинаю писать игру с функции main.

Оооо, Вам далеко еще значит. Основная разработка идет далеко до функции main.

Далее идёт разбиение на классы, библиотеки и т.д., но вот вопрос, что должно остаться в main, что б не перегружать сервер?

Это делается задолго до начала писанины и тем более до main. Да и как это может влиять на загрузку сервера? Че т совсем какая-то шняга у Вас получается.

Допустим на каждое действие у меня будет выведен отдельный класс в отдельном файле: отдельно на вызов и взаимодействие с инвентарём(с соответствующим подклассами), на боевой режим, на торговую операцию... но, в итоге-то может получиться так, что мейн будет дико перегружен различными циклами и свичами!?

причем здесь main? В main максимум будет подготовка корректного старта и завершения работы сервера.

Не получится ли так, что функция мейн постоянно ожидая каких-то действий от пользователя или воздействия на персонажа со стороны других объектов, начнёт отжирать нереально огромное количество ресурсов компа?

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

И как решаются такие вопросы?

Добро пожаловать в сложности :) асинхронную работу. и т.д. :) В большинстве случаев уже имеются готовые решения, наработки, паттерны.

И второй вопрос: подскажите пожалуйста, хотя бы в упрощённом варианте, как осуществляется связь между клиентом игры и сервером? Какие нужны инструменты и знания для этого?

Например, сокеты. Можно воспользоваться сырым API (например, в posix дофига всего для работы с сетью), можно готовыми обертками (например, boost::asio), всё зависит от Вас.

Как таже функция мейн на сервере понимает, что относить к действиям первого игрока, а что к действиям второго?

просто познакомьтесь с сетевым программированием

Не важно на сколько файлов и библиотек ты разобьешь свой main — это влияет только на удобо читаемость кода и удобство его изменения

А также на переносимость, время компиляции, расширяемость и т.д.

Второй достойный отлуп, после таки Григория ))))
И первый аргументированный.
Надо же, Croessmah, не поленился такую портянку написать. Думаешь поможет?

Думаешь поможет?

Ну если он сможет ответить на вопрос
«А на кой черт ты сдался этой команде?»
то может и поможет. Правда, если ответ будет «Я геймдизайнер от Бога и исчо Я гиниратор клёвых идей и Я планирую написать убицу WoW», то всё станет ясно и уже ничего не поможет )))

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.