Простроение большой программы.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Доброго времени суток!
Для начала, хочу сказать большое спасибо, за понятные уроки по с++! Во многом действительно очень помогли в плане понимания языка, но спросить хочу немного о другом.
Я начинающий кодер, но с большими амбициями :) в частности собираюсь писать собственную он-лайн игру. Да, я понимаю, что звучит смешно и наивно, но уверяю вас, весь масштаб катастрофы я полностью осознаю и буду собирать для этого дела свою команду. Лично мне программирование нужно скорее для понимания готового кода и что б не совсем уж быть дубом, как многие геймдизайнеры, фонтанирующие безумными идеями.
Собственно мой вопрос по логике построения ООП приложений.
Пока всё определяется малыми масштабами — ясность есть, но как быть с многоуровневыми и сложными приложениями? К примеру, я начинаю писать игру с функции main. Далее идёт разбиение на классы, библиотеки и т.д., но вот вопрос, что должно остаться в main, что б не перегружать сервер? Т.е. допустим, персонаж может просматривать информацию о себе(инвентарь, статы и т.д.), воевать с кем-то, путешествовать по локациям, торговать, и делать еще сотни и тысячи действий совершенно разного плана. Допустим на каждое действие у меня будет выведен отдельный класс в отдельном файле: отдельно на вызов и взаимодействие с инвентарём(с соответствующим подклассами), на боевой режим, на торговую операцию... но, в итоге-то может получиться так, что мейн будет дико перегружен различными циклами и свичами!? Т.е. в утрированом варианте, на плечи главной функции ляжет обязанность переключения между кучей файлов с классами и другими функциями, не говоря уже о куче доп. проверок на пересекаемость действий(например, что предпринять, если на персонажа напали в момент просмотра инвентаря или торговли?). Не получится ли так, что функция мейн постоянно ожидая каких-то действий от пользователя или воздействия на персонажа со стороны других объектов, начнёт отжирать нереально огромное количество ресурсов компа? И как решаются такие вопросы? паузой на работу до появления нового события? или таймер реакции, который будет проверять изменения раз в секунду реагируя на них с задержкой?
И второй вопрос: подскажите пожалуйста, хотя бы в упрощённом варианте, как осуществляется связь между клиентом игры и сервером? Какие нужны инструменты и знания для этого? Как всё это происходит на уровне общения между этими крайностями? И как сервер умудряется справляться с миллионами запросов в минуту, хотя бы при обработке 1000 пользователей-игроков?
Т.е. в целом, я могу себе представить, как выглядит взаимосвязь одного сервера с одним клиентом: путём последовательного выполнения программы мейн для него, как если бы всё это происходило на одном компьютере. А если пользователей становится 2? Как таже функция мейн на сервере понимает, что относить к действиям первого игрока, а что к действиям второго? Ну в самом деле, не разворачивать же на сервере отдельный код для каждого нового пользователя? или... всё же разворачивать? Т.е. будет функция мейн для игрока1, такая же для игрока2, игрока3 и т.д.? Которые будут загружаться при логине персонажа в игру и удаляться при выходе из неё(разумеется, предварительно сохранив все данные о произошедших изменениях в базу)? А как при этом будет осуществляться работа подклассов? Т.е. игрок1 начал сражение, соответственно воспользовался функцией отвечающей за развёртывание боевой карты, но тут и игрок2 тоже попал в бой и та же функция начнёт применятсья к нему, так как эта функция поделит запросы от разных пользоваталей, совершающих разные действия?
Понимаю, что очень сумбурно написал, но мне не требуется сейчас подробных примеров с кодами и т.д., меня интересует понимание функционала как такового, что б было правильно и экономично для ресурсов сервера, компа пользователя и трафика.
Заранее спасибо за помощь!
И таки этот человек говорит, что полностью осознает масштаб катастрофы?
таки да :) в основном я геймдиз, но геймдизу так же нужно знание и понимание того, что будут/могут сделать его коллеги. Я нахватался знаний из разных областей за последние 2 года, необходимые для создания и руководства он-лайн проектом. Это и с++, и sql, и js, юридические вопросы, и бухгалтерия, и ценовые вопросы по аренде серверов, разумеется и геймдизайнерство и принципы и современные тренды игростроя и ещё кучу всего, не говоря уже о многотомнике концепта игры с сотнями формул, таблиц, графиков и т.д.
Но, програмистика даётся тяжелее всего, поскольку в основах был только годовой курс ООП в институте почти 15 лет назад. Из которого, если уж говорить честно, я мало что понял. Сейчас навёрстываю, но, что б свести в единую систему знания по синтаксису, алгоритмике, и т.д. конкретного языка, требуется для начала абстрактное понимание процессов. Так проще поставить самому себе задачу, что изучать дальше и к чему готовиться. Вот в этом абстрактном понимании мне и нужна помощь. Куда ни зайдёшь, везде пачка ссылок по теории сетей, пакетам, трафику и т.д. Ни к чему не привязаные, ни о чём мне не говорящие. И тем более нет связи, что де, вот код сервера, вот бд, вот клиент, вот так и через туды осуществляется взаимодействие так и вот так. Потому и задаю вопрос на этом ресурсе, что тут руководства с конкретными примерами, где и в каком случае актуально то или это, так что, есть надежда, что и на мои вопросы я могу ожидать аналогичные, конкретные ответы. Ну, а нет, так нет, разберусь сам, только времени угрохаю многократно больше, чем если буду иметь чёткий план по самообразованию.
К чему такие сообщения, если не знаешь, что ответить по теме, так зачем придираться с глупыми шутками?
Не важно на сколько файлов и библиотек ты разобьешь свой main — это влияет только на удобо читаемость кода и удобство его изменения, тесть если изменение одного модуля не влияет на остальные то изменив его не нужно менять другие. Насчет отжирания ресурсов, игра требующая макс. FPC так и пишется, по максимуму, без всяких таймеров и ожиданий. Не дать отожрать все время CPU твоей программе не даст система, если конечно не дать ей приоритет Real Time. Но тогда задумается система, а твоя программа от нее зависит. Но я не об этом, ведь у тебя программа одно поточная, и время выделяемое ей процессором не зависит от ее размера и количества файлов и количества кода в них.
Вот программ отжирающая время CPU по максимуму, столько же сколько и твой main, хотя кода в ней кот наплакал.
Другое дело много поточность (Погугли планирование потоков).
Провел эксперимент, Запустил много выше перечисленный программ в Real Time, моделируя много поточность программы с потоками нагружающими проц. по максимуму, система начала подтормаживать с запуском 7го потока. При запуске с средним приоритетом тормоза появились при 8ми потоках.
CPU восьми ядерный.
Да кстати погугли: «Приостановка процесса». И ты поймешь весь механизм ожидания. В самой программе ждать события в цикле нельзя, как у меня выше, если вписать вместо a++; ожидание какого либо события, процесс все равно будет грузить CPU по максимуму. Но если ты считаешь, что твоей программе больше нечего ждать, то она может уступить свое время другим программам. И когда твоя программа после этого проснется решает не она а система. По этому так поступают только когда ожидают освобождения каких либо ресурсов. И если ты в своей онлайн игре будешь не обдуманно так всем уступать, то твои потенциальные клиенты устанут находится в ожидании реакции твоей программы на их действия. В общем ты их тоже уступишь другим ресурсам. Кстати пример: ты ожидаешь события из сети его нет и ты уступаешь время другим процессам. Только уступил, произошло событие, а твой процесс получил время на выполнение только спустя, какое то время. И отреагировал уже с задержкой, плюс время задержки, передачи данных по сети и вот и разсинхрон и лаги.
В таких случаях я всегда задаю ряд вопросов.
А на кой черт ты сдался этой команде?
Что ты можешь ей дать полезного?
А команда будет работать за денюшку или на энтузиазме?
А если на энтузиазме, то кушать на что покупать?
Оооо, Вам далеко еще значит. Основная разработка идет далеко до функции main.
Это делается задолго до начала писанины и тем более до main. Да и как это может влиять на загрузку сервера? Че т совсем какая-то шняга у Вас получается.
причем здесь main? В main максимум будет подготовка корректного старта и завершения работы сервера.
Ожидание — это нормально, если его построить так, чтобы во время ожидания ресурсы не кушались.
Добро пожаловать в сложности :) асинхронную работу. и т.д. :) В большинстве случаев уже имеются готовые решения, наработки, паттерны.
Например, сокеты. Можно воспользоваться сырым API (например, в posix дофига всего для работы с сетью), можно готовыми обертками (например, boost::asio), всё зависит от Вас.
просто познакомьтесь с сетевым программированием
А также на переносимость, время компиляции, расширяемость и т.д.
Второй достойный отлуп, после таки Григория ))))
И первый аргументированный.
Надо же, Croessmah, не поленился такую портянку написать. Думаешь поможет?
Ну если он сможет ответить на вопрос
«А на кой черт ты сдался этой команде?»
то может и поможет. Правда, если ответ будет «Я геймдизайнер от Бога и исчо Я гиниратор клёвых идей и Я планирую написать убицу WoW», то всё станет ясно и уже ничего не поможет )))