Странный заголовок? Что это тут делает? Кто этот странный парень?
Зайдем немного издалека. Не так давно я стал чаще смотреть подкасты ММОзга. Там в последнее время тема самой разработки и того, что с ней связано, стала подниматься крайне часто. Вероятнее всего, причина в том, что многие разработчики стали куда раньше анонсировать свои игры, больше делиться информацией о каких-то внутренних явлениях самого процесса игростроения.
Кроме того, недавно вышла очень значимая, как мне кажется, заметка в «Холодном Кофе». Именно эти разговоры и статья сподвигли меня сначала самому обдумать тему, которую я хочу поднять, затем мы довольно эмоционально обсудили это с коллегой, а позже я решил, что есть смысл ею поделиться.
Вы спросите, но почему же тут? Есть же Хабр, там же эта тема актуальнее. Однако, есть причины, по которым я считаю, что эта статья должна быть именно тут.
Одна из этих причин, которая важна лично для меня, это то, что я до сих пор, несмотря на несколько лет разработки, считаю себя и свой проект тем, что можно охарактеризовать фразой «от игроков для игроков».
Вторая причина состоит в том, что я не профессионал. Это значит не то, что я сам не понимаю, чем я занимаюсь, как бы нескромно это ни звучало, а то, что я не зарабатываю себе этим деньги, хотя, скорее всего, когда-то и буду. И, на мой взгляд, это создает приличную пропасть в понимании между мной и подавляющим большинством разработчиков. (особенно ярко я это почувствовал после анонса Epic Store, но это совсем другая история)
Ну и, конечно, не менее важным фактором публикации этого текста на ММОзге стала сама обстановка в Gamedev-среде. Как я уже написал выше, заметка о геймдизайне произвела на меня определенное впечатление. Пусть я и не удивился той системе в духе игровых автоматов\одноруких бандитов, но известные места активно подгорели.
Итак, краткий ответ на вопрос из заголовка — да, архитектура мешает геймдизайну
Можно было бы на этом закончить, но мы же тут не для этого, правда?
Сложный и развернутый ответ требует некоторого копания в дебрях того, с чем сталкиваются как именитые и опытные ААА разработчики, так и индюшатина, вроде моей любимой команды.
Начнем же копать! А копать мы будем к самой сути, к корням, к тому скелету, на который мы натягиваем нашу игру.
Почти вся современная игровая индустрия, как минимум та, что работает в области мультиплеера и тем более ММО, использует в большинстве случаев парадигму программирования, которую в свое время популяризовал С++ — объектно ориентированное программирование(ООП).
Основная его суть состоит в том, что разработчикам предлагается в качестве минимальных неделимых блоков своей программной логики создавать так называемые объекты, которые куда лучше понятны для человеческого мозга. Они имеют свои свойства, которые можно изменять. Они имеют свои внутренние механизмы\функции\методы, которые могли бы изменять эти самые свойства. И самое главное — они наследуют свойства и методы друг друга, имея свойства родителя и получая новые. Эти объекты классифицированы, они могут объединяться, они могут содержать в себе другие объекты, и есть еще много более сложных особенностей этой парадигмы, например полиморфизм, которые только усложняют описание, но все это я пишу к тому, чтобы стало понятно, что иерархия всех этих классов\объектов — это довольно сложная и громоздкая структура, которая во многом создана для удобства разработки. Это ее ключевая фишка и проблема одновременно.
Какие же проблемы возникают в этой парадигме программирования и какое же отношение это имеет к геймдизайну?
Иерархии убивают расширяемость.
Наследование и полиморфизм были созданы для расширяемости вашей программы. Практически все хорошие разработчики знают и понимают эти особенности и используют их для создания новых объектов, на базе уже имеющихся. Это дает возможность создавать и новые механики, просто изменяя старые, и создавать, например, новые предметы на основе уже существующих объектов. Но как бы странно это ни звучало, как минимум для многопользовательских онлайн игр, наследование убивает расширяемость системы. Не пугайтесь, это не попытка вас запутать или глупо пошутить. Все дело в том, что эти самые сложные иерархии не могут увеличивать свою сложность до бесконечности по многим причинам, как просто из-за того, что с таким кодом становится очень сложно работать, так и из-за того, что сам код начинает работать хуже. И тут речь уже о масштабируемости системы, то есть возможность выдержать большие нагрузки.
Кроме всего прочего, я считаю важным упомянуть, что сегодня, в век многоядерных систем, ООП либо делает почти невозможным распараллеливание большинства задач в игре, либо делает это настолько сложным, что встает вопрос о целесообразности такой мультипоточности.
Также новые фичи, если они представляют из себя нечто сильно отличающееся от того, что уже есть в игре, при добавлении требуют переписывания и\или кардинальных изменений в имеющемся коде. То есть иерархии классов\объектов требуют увеличения зависимостей и наследований, или требуют создания какой-то новой сложной иерархии. И снова это увеличивает сложность всей системы и нагрузку при исполнении кода.
Представьте себе иерархию, которая в сотни раз больше, чем эта и имеет куда более запутанные связи между объектами.
По ссылке так же можно посмотреть иерархию только небольшой части Unreal Engine 4
Так, к вам приходит воодушевленный геймдизайнер с горящими глазами и рассказывает о том, какую невообразимо революционную, глубокую и вообще уберклассную механику он придумал. А вы, поразмыслив вместе с ним, начинаете ее кромсать, сокращать, упрощать и видоизменять так, чтобы вам не пришлось переписывать весь ваш код или заниматься тем, что называется велосипедостроением. И тут мы подходим ко второму пункту.
Работает — не трогай.
Сложная иерархия классов\объектов часто пугает вопросом своего переписывания. Не менее пугающим может стать вопрос велосипедостроения, который предполагает создание решений с нуля. Решений, которые уже где-то когда-то кем-то были созданы и относительно неплохо работают, но могут чем-то не устраивать разработчиков. И тут есть только два варианта. Первый — писать свое, а значит тратить время и силы, а также, возможно, в процессе отказаться от какой-то части механик. И второй — взять то, что тебе не совсем подходит, но зато готово и уже работает. А, как говорится, если работает — не трогай. Ну, и бери в следующий проект, конечно. Бытует мнение, что хороший разработчик не пилит велосипеды, а берет старые велосипеды из старых проектов. И в каком-то смысле это правильно, но лишь до тех пор пока не окажется, что нужен совсем даже не велосипед и даже не транспорт вовсе.
То, что кажется удобным и понятным для нас, для ЭВМ выглядит очень сложным и хаотичным.
Почему же ООП плох в контексте ММО? Ведь так удобно мыслить объектами и классами по аналогии с реальным миром, привычным для нашего понимания. Мы видим структурированные системы в таких иерархиях. Однако то, что кажется удобным и понятным для нас, для ЭВМ выглядит очень сложным и хаотичным. Дело в том, что со времен первых процессоров с современной архитектурой типа i386 прошло почти 35 лет, за это время появилось много новых парадигм и популяризовалось ООП, но, как мы понимаем, сами процессоры кардинально не изменились. И то, что сегодня является мейнстримом для программирования, для архитектуры вычислительных систем что-то новое, непонятное и очень труднообрабатываемое.
И что же, мы в тупике? Пора срочно переделывать все процессоры? Нет, достаточно просто начать понимать, как «думает» ЭВМ, как она работает и какие данные для нее понятнее. И к сожалению для тех, кто испытывает теплые чувства к объектно ориентированной парадигме программирования, она безнадежно провалилась, как минимум в высоконагруженных сложных системах, таких как ММО.
Что может быть надежнее проверенного велосипеда?
Итак, все предыдущие пункты сходятся в последнем. Все хотят что-то новое, инновационное и революционное в играх. Но исходя из вышеперечисленных проблем, сделать франкенштейна из уже имеющихся сложноустроенных иерархий, которые надежно служили разработчикам годами, куда проще и дешевле, ведь у вас есть инвесторы. А как известно, инвесторы не хотят тратить годы на реализацию каких-то новых технологий, писать что-то с нуля, переписывать и внедрять фичи, использовать новые парадигмы. От вас не хотят инноваций, ведь для инвестора важна надежность, а что может быть надежнее проверенного велосипеда?
Для понимания масштаба трагедии, могу с уверенностью заявить, что все это не только проблемы тех, кто, например, пишет свой движок с нуля. Может даже наоборот — инди-разработчикам в такой ситуации несколько проще маневрировать. А вот такие гиганты как Unreal Engine, Unity, CryEngine страдают от своих ООП реализаций больше, чем игры на собственных движках.
Так в нашей команде мы очень долго мучили себя и UE4, копаясь в исходных кодах, занимаясь попытками понять последовательности действий при исполнении программы и различить все связи в сложной многоуровневой иерархии. Мы пытались переписать\адаптировать какие-то отдельные части движка под свои нужды, что попросту съело наше бесценное время. В конечном счете, к чему же мы пришли? Ну, что же, наш проект мы просто переписали, точнее даже написали заново, используя кардинально отличающуюся парадигму. Возможно, если кого-то это заинтересует, я смогу перевести и адаптировать статьи об этой технологии.
Другие разработчики решают это тем самым кромсанием механик, отказом от них, разного рода ухищрениями, которые так или иначе упрощают геймплей в угоду возможности хоть как-то поддерживать код, продолжать разработку и наращивать функционал.
Хочется что-то написать в конце заметки. Может, что-то вроде напутствия или какого-то вывода, но я сам не уверен, какой простой вывод в пару предложений можно было бы оформить. Так что я просто оставлю читателю возможность самому обдумать всю эту, наверное, несколько сумбурную информацию и сделать свои выводы.
Спасибо за внимание!
Зайдем немного издалека. Не так давно я стал чаще смотреть подкасты ММОзга. Там в последнее время тема самой разработки и того, что с ней связано, стала подниматься крайне часто. Вероятнее всего, причина в том, что многие разработчики стали куда раньше анонсировать свои игры, больше делиться информацией о каких-то внутренних явлениях самого процесса игростроения.
Кроме того, недавно вышла очень значимая, как мне кажется, заметка в «Холодном Кофе». Именно эти разговоры и статья сподвигли меня сначала самому обдумать тему, которую я хочу поднять, затем мы довольно эмоционально обсудили это с коллегой, а позже я решил, что есть смысл ею поделиться.
Вы спросите, но почему же тут? Есть же Хабр, там же эта тема актуальнее. Однако, есть причины, по которым я считаю, что эта статья должна быть именно тут.
Одна из этих причин, которая важна лично для меня, это то, что я до сих пор, несмотря на несколько лет разработки, считаю себя и свой проект тем, что можно охарактеризовать фразой «от игроков для игроков».
Вторая причина состоит в том, что я не профессионал. Это значит не то, что я сам не понимаю, чем я занимаюсь, как бы нескромно это ни звучало, а то, что я не зарабатываю себе этим деньги, хотя, скорее всего, когда-то и буду. И, на мой взгляд, это создает приличную пропасть в понимании между мной и подавляющим большинством разработчиков. (особенно ярко я это почувствовал после анонса Epic Store, но это совсем другая история)
Ну и, конечно, не менее важным фактором публикации этого текста на ММОзге стала сама обстановка в Gamedev-среде. Как я уже написал выше, заметка о геймдизайне произвела на меня определенное впечатление. Пусть я и не удивился той системе в духе игровых автоматов\одноруких бандитов, но известные места активно подгорели.
Можно было бы на этом закончить, но мы же тут не для этого, правда?
Сложный и развернутый ответ требует некоторого копания в дебрях того, с чем сталкиваются как именитые и опытные ААА разработчики, так и индюшатина, вроде моей любимой команды.
Начнем же копать! А копать мы будем к самой сути, к корням, к тому скелету, на который мы натягиваем нашу игру.
Почти вся современная игровая индустрия, как минимум та, что работает в области мультиплеера и тем более ММО, использует в большинстве случаев парадигму программирования, которую в свое время популяризовал С++ — объектно ориентированное программирование(ООП).
Основная его суть состоит в том, что разработчикам предлагается в качестве минимальных неделимых блоков своей программной логики создавать так называемые объекты, которые куда лучше понятны для человеческого мозга. Они имеют свои свойства, которые можно изменять. Они имеют свои внутренние механизмы\функции\методы, которые могли бы изменять эти самые свойства. И самое главное — они наследуют свойства и методы друг друга, имея свойства родителя и получая новые. Эти объекты классифицированы, они могут объединяться, они могут содержать в себе другие объекты, и есть еще много более сложных особенностей этой парадигмы, например полиморфизм, которые только усложняют описание, но все это я пишу к тому, чтобы стало понятно, что иерархия всех этих классов\объектов — это довольно сложная и громоздкая структура, которая во многом создана для удобства разработки. Это ее ключевая фишка и проблема одновременно.
Какие же проблемы возникают в этой парадигме программирования и какое же отношение это имеет к геймдизайну?
Наследование и полиморфизм были созданы для расширяемости вашей программы. Практически все хорошие разработчики знают и понимают эти особенности и используют их для создания новых объектов, на базе уже имеющихся. Это дает возможность создавать и новые механики, просто изменяя старые, и создавать, например, новые предметы на основе уже существующих объектов. Но как бы странно это ни звучало, как минимум для многопользовательских онлайн игр, наследование убивает расширяемость системы. Не пугайтесь, это не попытка вас запутать или глупо пошутить. Все дело в том, что эти самые сложные иерархии не могут увеличивать свою сложность до бесконечности по многим причинам, как просто из-за того, что с таким кодом становится очень сложно работать, так и из-за того, что сам код начинает работать хуже. И тут речь уже о масштабируемости системы, то есть возможность выдержать большие нагрузки.
Кроме всего прочего, я считаю важным упомянуть, что сегодня, в век многоядерных систем, ООП либо делает почти невозможным распараллеливание большинства задач в игре, либо делает это настолько сложным, что встает вопрос о целесообразности такой мультипоточности.
Также новые фичи, если они представляют из себя нечто сильно отличающееся от того, что уже есть в игре, при добавлении требуют переписывания и\или кардинальных изменений в имеющемся коде. То есть иерархии классов\объектов требуют увеличения зависимостей и наследований, или требуют создания какой-то новой сложной иерархии. И снова это увеличивает сложность всей системы и нагрузку при исполнении кода.
Представьте себе иерархию, которая в сотни раз больше, чем эта и имеет куда более запутанные связи между объектами.
По ссылке так же можно посмотреть иерархию только небольшой части Unreal Engine 4
Так, к вам приходит воодушевленный геймдизайнер с горящими глазами и рассказывает о том, какую невообразимо революционную, глубокую и вообще уберклассную механику он придумал. А вы, поразмыслив вместе с ним, начинаете ее кромсать, сокращать, упрощать и видоизменять так, чтобы вам не пришлось переписывать весь ваш код или заниматься тем, что называется велосипедостроением. И тут мы подходим ко второму пункту.
Сложная иерархия классов\объектов часто пугает вопросом своего переписывания. Не менее пугающим может стать вопрос велосипедостроения, который предполагает создание решений с нуля. Решений, которые уже где-то когда-то кем-то были созданы и относительно неплохо работают, но могут чем-то не устраивать разработчиков. И тут есть только два варианта. Первый — писать свое, а значит тратить время и силы, а также, возможно, в процессе отказаться от какой-то части механик. И второй — взять то, что тебе не совсем подходит, но зато готово и уже работает. А, как говорится, если работает — не трогай. Ну, и бери в следующий проект, конечно. Бытует мнение, что хороший разработчик не пилит велосипеды, а берет старые велосипеды из старых проектов. И в каком-то смысле это правильно, но лишь до тех пор пока не окажется, что нужен совсем даже не велосипед и даже не транспорт вовсе.
Почему же ООП плох в контексте ММО? Ведь так удобно мыслить объектами и классами по аналогии с реальным миром, привычным для нашего понимания. Мы видим структурированные системы в таких иерархиях. Однако то, что кажется удобным и понятным для нас, для ЭВМ выглядит очень сложным и хаотичным. Дело в том, что со времен первых процессоров с современной архитектурой типа i386 прошло почти 35 лет, за это время появилось много новых парадигм и популяризовалось ООП, но, как мы понимаем, сами процессоры кардинально не изменились. И то, что сегодня является мейнстримом для программирования, для архитектуры вычислительных систем что-то новое, непонятное и очень труднообрабатываемое.
И что же, мы в тупике? Пора срочно переделывать все процессоры? Нет, достаточно просто начать понимать, как «думает» ЭВМ, как она работает и какие данные для нее понятнее. И к сожалению для тех, кто испытывает теплые чувства к объектно ориентированной парадигме программирования, она безнадежно провалилась, как минимум в высоконагруженных сложных системах, таких как ММО.
Итак, все предыдущие пункты сходятся в последнем. Все хотят что-то новое, инновационное и революционное в играх. Но исходя из вышеперечисленных проблем, сделать франкенштейна из уже имеющихся сложноустроенных иерархий, которые надежно служили разработчикам годами, куда проще и дешевле, ведь у вас есть инвесторы. А как известно, инвесторы не хотят тратить годы на реализацию каких-то новых технологий, писать что-то с нуля, переписывать и внедрять фичи, использовать новые парадигмы. От вас не хотят инноваций, ведь для инвестора важна надежность, а что может быть надежнее проверенного велосипеда?
Для понимания масштаба трагедии, могу с уверенностью заявить, что все это не только проблемы тех, кто, например, пишет свой движок с нуля. Может даже наоборот — инди-разработчикам в такой ситуации несколько проще маневрировать. А вот такие гиганты как Unreal Engine, Unity, CryEngine страдают от своих ООП реализаций больше, чем игры на собственных движках.
Так в нашей команде мы очень долго мучили себя и UE4, копаясь в исходных кодах, занимаясь попытками понять последовательности действий при исполнении программы и различить все связи в сложной многоуровневой иерархии. Мы пытались переписать\адаптировать какие-то отдельные части движка под свои нужды, что попросту съело наше бесценное время. В конечном счете, к чему же мы пришли? Ну, что же, наш проект мы просто переписали, точнее даже написали заново, используя кардинально отличающуюся парадигму. Возможно, если кого-то это заинтересует, я смогу перевести и адаптировать статьи об этой технологии.
Другие разработчики решают это тем самым кромсанием механик, отказом от них, разного рода ухищрениями, которые так или иначе упрощают геймплей в угоду возможности хоть как-то поддерживать код, продолжать разработку и наращивать функционал.
Хочется что-то написать в конце заметки. Может, что-то вроде напутствия или какого-то вывода, но я сам не уверен, какой простой вывод в пару предложений можно было бы оформить. Так что я просто оставлю читателю возможность самому обдумать всю эту, наверное, несколько сумбурную информацию и сделать свои выводы.
Спасибо за внимание!
37 комментариев
Момент
Несмотря на все это, автор приходит к правильным выводам:
Внезапно оказывается, что это всё бизнес, и дешевле копировать, чем создавать что-то новое. Но в этом то и отличие индустрии от искусства. Приоритеты разные. Только архитектура и гейм-дизайн здесь не при чем.
ООП лишь принцип. Как его применять — отдельная тема. Знание основ Software Engineering для гейм-дизайнера важно (и обязательно в случае с независимыми разработчиками, которые носят множество шляп одновременно). Можно делать плохие системы, а можно и хорошие, регулируя количество внутренних и внешних связей, используя контейнеры и компоненты, и т.д.. Это, в буквальном смысле, целая наука. Требующая профессионального подхода.
Точно также и гейм-дизайн постепенно начинают преподавать в университетах, это же тоже целая наука. А упрощение дизайна систем, в ней, на мой взгляд, не стоит подавать как нечто плохое.
Наоборот, упрощение — крайне полезно. Если можно что-то упростить, не теряя сути, то это плюс, а не минус. Игры должны быть доступны и понятны.
Ведь игра — набор механик, которые призваны создавать некий опыт. Как именно они это делают, иногда скрываясь от взгляда окружающих и срезая углы, там, где это можно сделать, не важно.
PS: начинающий независимый гейм дизайнер/софт инженер, адепт C#/Unity
Но намекну, что я не просто так упомянул архитектуру процессоров и то как они воспринимают вообще любые иерархии, даже не слишком сложные.
Ах да, я бы не сказал, что кого-то защищаю, как раз даже во многом наоборот.)
Повторю свою ключевую мысль. Вопросы производительности важны, но они решаемы, причем даже в одно-два лица/разработчика, при мизерном бюджете (см кейс Haven & Hearth). В случае хорошей команды и бюджета побольше они решаемы с очень крутым результатом (см кейс EVE-Online). Поэтому я не вижу особого смысла рассуждать о технической стороне вопроса.
Финансирование и инвестиции в то, что не факт что стабильно заработает или будет интересным — вот это вопрос, да. Но он не имеет отношения к ООП, архитектурам процессоров или гейм дизайну.
Понятное дело, что софт не создается путем бросания денег в монитор. Но, как и со всем остальными предприятиями в жизни, это вопрос знаний, навыков, профессионализма, управления, эффективности, которые и определяют успех.
Вы просто во все большие абстракции уходите. Я говорил о конкретной парадигме, которая преобладает в софте, о ее недостатках и о том, почему, как я считаю, она сильно ограничивает, если можно так выразиться, полет фантазии, в отличии от альтернатив.
Суть не в абстракции. Суть в механизмах взаимодействия. Современное поколение программистов в большей степени само стремится использовать уже имеющиеся наработки, а не создавать свои. Зачем делать что-то новое, когда кто-то уже сделал аналогичное. Я не в курсе системы работы в крупных компаниях, но сдается мне, что очень значительная часть программистов там работает именно по принципу «не будем изобретать велосипед». При этом они даже не представляют себе как работает «звездочка» на заднем колесе: Есть цепь, есть звездочка, есть колесо, есть педальный привод. Усилие на колесо меньше, чем усилие на звездочку, но скорость колеса больше — вот все, что они знают. А что там внутри звездочки и педального привода — их не колышет совершенно, хорошо если знают по какому принципу усилие повышается. Они получают конкретную задачу — изменяют конкретный модуль. Изменить можно что угодно и как угодно. Даже в уже готовом движке. И ООП в принципе позволяет делать любой модуль совершенно независимо от других модулей.
Проблема в общем видении системы. и, как уже заметил товарищ, в требованиях тех, кто дает деньги. Увидеть всю систему, оптимизировать ее, найти способ внедрения нового — все это задача не программиста, а гейм-дизайнера, который вообще может не понимать как работают отдельные модули, но прекрасно должен понимать как они взаимодействуют. И ООП позволяет в этом случае делать главное — идти сверху вниз, от общего к частному, уточняя детали по мере развития проекта. И делать это усилиями совершенно разных людей, один из которых видит всю картину, а второй умеет сделать отдельный мазок. Проблема не в ООП, который прекрасно подходит для этого. Проблема в видении общего. В желании изменять отдельные готовые модули. В финансировании и отведенном времени, в конце-концов.
В общем и целом понятно, что вы стремитесь донести. Однако брюзжание «ООП не дает простора творчеству» длятся уже больше 10 лет. Точно также, как и споры о лучшем языке программирования, и еще много чего. И это ни к чему не приводит, хотя «убийц ООП» предложено было уже не один десяток, дай бог памяти. «ООП устарел» — это что-то из разряда мифов типа «В Ворде верстать нельзя», «Линукс лучше Виндовс», «Старые игры были лучше». Все об этом знают, а те, кто не знает, делают шедевры.
Иерархии это лишь способ группировать данные/функционал. Для удобства восприятия и работы с ними. Чем лучше сгруппируешь, тем меньше будет конечного кода. Наследование и полиморфизм — тоже способы уменьшить ненужное дублирование, сократить/упростить код, уменьшить работу. Это, в купе с модульностью, и есть шаги к улучшению масштабируемости системы. Плюс, к упрощению одновременной работы над ней множеству людей. Т.е. абсолютно противоположное тому, о чем говорите вы.
Стоит сказать, что я кроме как ООП языками не владею, кроме, разве что, BASIC, которым я последний раз пользовался… м… лет так двадцать назад, будучи школьником. Поэтому никаких контрпримеров с использованием других парадигм я привести не могу. Как именно они могут дать лучшую масштабируемость и простоту работы?
Представьте, что у вас вообще нет иерархий, а добавление нового функционала это буквально написание одной функции, и все. И самое главное это абстракции с нулевой стоимостью.
Вы пишете про то как удобно наследовать, что это надо делать правильно и аккуратно, но наследование и полиморфизм не просто «группируют» функционал, они тащат за собой много того, что вам не нужно. Может что-то из этого сокращает код и упрощает работу здесь и сейчас, но когда процессор будет долго и пичально искать а где же тот виртуальный метод, который от меня хотят, он вам спасибо не скажет. А вот теперь представьте, что у вас есть абсолютно такие же абстракции, вроде объектов, но никакого полиморфизма, наследования и даже создания самих классов и структур для их существования вам не нужно.
Я просто очень не хочу расписывать все тут, давайте я вам пообещаю, что напишу еще одну заметку просто? =)
А если очень хочется, то почитайте про DOD и ECS.
ООП языки позволяют писать хороший, «бодрый» код. Да и совсем не обязательно всегда использовать объекты. Здесь уже упоминали structs.
Я погуглил DoD. Собственно, начиная с Unity 2018, если я правильно понимаю, идет адаптация ECS/DoD:
unity.com/unity/features/job-system-ECS
Я взялся за Unity поздней осенью и все еще учу Unity 2017, поэтому руками не щупал, не скажу ничего.
Боттом лайн, это все вопрос оптимизации и производительности, а не экзистенциальный кризис какой-то. Ваш изначальный посыл с использованием слова «убивает» просто не соответствует действительности. «Затрудняет» или «усложняет» — может быть. Но не более.
Далее, никакого внимания на упоминание абстракций с нулевой стоимостью.
"«Затрудняет» или «усложняет»" на уровне 100 человек играет в одной сессии с 50к практически статичных объектов. А убивает на уровне ММО. Да, можно очень долго мучиться и выжимать из себя супер круто настроенную архитектуру-гибрид бульдога с носорогом, тратя на это время и деньги, оплачивая какой-нибудь Spatial OS, имея ряд трудностей с сопровождением, отладкой и ведением новых фич, а можно просто взять и добавлять без напряга десятки тысяч динамически изменяющихся сущностей, с полностью индивидуальным набором свойств, которые имеют ограничения только в виде объема вашей RAM, взаимодействующих друг с другом, не требующих практически никакого изменения для распараллеливания обработки и еще кучу всего.
Ну я не прав и не понимаю, видимо, ничего в ООП.
Когда вы говорите про ООП, у меня складывается ощущение, что вы имеете ввиду, что весь код, от и до, должен состоять из его атрибутов, и манипулировать только ими. Что все должно упираться в иерархии классов и объекты. Я правильно вас понимаю?
Давайте разграничивать. Языки программирования поддерживают множество парадигм и методов написания кода, даже если они ориентированы в большинстве своем на какую-то конкретную. Код должен быть в первую очередь эффективен. Поэтому вполне логично использовать другие методы в тех местах, где это принесет лучший эффект.
Когда вы ставите ООП главным злодеем и обвиняете в убийстве возможности создавать инновационные игры и расширять функционал, вы, мало того, что игнорируете уже созданные проекты, которые своим существованием просто напросто кричат об обратном, так еще и делаете вид будто программисты ограничены единым методом формирования кода и шаг влево, шаг вправо — расстрел.
Начнем с того, что это разные парадигмы, а не методы, это важно. Попытки связать ECS ( я включаю туда и DOD, хотя это не совсем одно и то же, но без него ECS не обладает тем потенциалом, о котором я тут говорю) с ООП вы просто получите bottleneck, который будет вас ограничивать. Вам придется писать какие-то обертки, инжекторы и вообще прыгать вокруг с барабаном. Так что да, код должен быть эффективным, а еще простым в написании и сопровождении.
ООП не главный злодей, он просто не дает такой свободы и простоты, а это значит, что порог вхождения для людей выше. И я не обвинял его в убийстве ( никто пока никого не убил, да и не убьет, скорее всего), я говрил, что он это пытается сделать.
Если вокргу столько инноваций и классных ММО, то почему на ММОзге постоянно пишут статьи о том, что: как-то не видно масштаба, все как-то повторяется, мало новых идей и т.д. Я считаю, что ответ именно где-то в области статистики, результаты которой определяются теми самыми порогом вхождения и сложностью, которые можно было бы сильно снизить.
Вот. Вы сами подобрали более подходящее слово. Именно ограничениями, или затруднениями, как я уже сказал комментарием выше. Но никак не «убийством». А с ограничениями мы сталкиваемся в любом случае. Какими именно уже зависит от эффективности составленного кода (т.е. возможностей инструментария и навыков пишущего).
Собственно, говоря о уже готовых движках, вроде Unity, UE и прочих, то надо всегда помнить, что они, как и вообще высокоуровневое программирование в принципе (если сравнивать с низкоуровневым), предоставляют упрощения юзабилити (во множестве его проявлений) в ущерб производительности. Кастомный движок, созданный специально для какой-то цели по определению имеет смысл существовать именно для улучшения производительности и для избавления от ненужного функционала и мусора.
Когда мне, например, достаточно производительности Unity для реализации задуманного, то это осознанный выбор инструмента, способного дать возможность реализовать все, что я хочу. Когда пара студентов взяла Java и стала работать над H&H, у них получилось реализовать кучу интересных механик, при том, что они не гнались за созданием огромного мира с тысячами игроков. Когда у CCP Games была необходимость делать единый сервер для большого мира, они стали использовать Stackless Python, который удовлетворял их нуждам. При чем здесь ограничения ООП, когда их никто ни на кого не накладывает? Люди пользуются методиками и инструментами в рамках поставленной задачи. Да, цена входа разная, конечно, но она соответствует уровню сложности задачи, что вполне закономерно. Хотя, опять же, технологии не стоят на месте, и тренд идет лишь в сторону снижения цены (как в примере введения обозначенных вами технологий в Unity 2018).
Посмотрим на технологии. ^_^
Могу говорить только за себя. Я в принципе считаю ММО сомнительным жанром, в плане эффективности создания сетевых экспириенсов. Вопросы масштаба меня не сильно заботят, по этой же причине. А ограничение инноваций, как в вашей же заметке и сказано, лишь следствие недостатка инвесторов, которые готовы в них вкладываться.
В статье, правда, много воды. Также хотелось бы реальных примеров, а не иерархий диалогов печати файла и сохранения шаблонов, которые не имеют отношения к играм.
Не соглашусь с объявлением ООП виновником всех бед. Если сталкиваетесь с проблемами в иерархиях, то не нужно делать такие длинные и развесистые иерархии, а лучше использовать композицию. Я хоть и не игру делаю, но у меня обычно трейт или абстрактный класс, который расширяет библиотечный класс, и у него пара наследников. Всё.
Писать многопоточный код намного сложнее, чем однопоточный, но причём здесь ООП? Разве многопоточный код со struct-ами на чистом С или даже ассемблере выглядит проще и понятнее? В любом случае нужно или куча синхронизаций при работе с shared mutable state, или неизменяемые объекты и функциональный подход (всё равно объекты, как ни крути). Или пересылать сообщения в очередях.
Для высоконагруженных систем есть микросервисы, которые, опять же, на объектно-ориентированных языках обычно пишутся.
Этот принцип подходит далеко не всегда, а только для тех частей программы, которые Не нужно развивать. Например, ланчер или окошко настроек. Их один раз написали, и больше новых функций от них не потребуется. А вот для основного кода, который всё время развивается, лучше другой принцип — постоянный рефакторинг. Тогда и будет нормальный код, который не придётся полностью переписывать, а только частично поменять при добавлении новой механики.
Я к большому сожалению просто куда-то посеял сгенерированную в Doxygen иерархию классов для Unreal, уж больно много места все это занимало.
Что ж, по остальному могу пройтись в след. раз, т.к. я, если честно, не думал, что так много людей тут есть, кто прекрасно бы все понял и «в терминах», так сказать.
DOD (Data Oriented Design) напрямую дает поточную изоляцию памяти, что выливается как в неблокирующие операции, так и в т.н. positive sharing (положительную работу предсказателя и постоянную актуальность данных в L1).
Семейство CO (Component Oriented) и ES (Entity System) парадигм предлагает набор решений для широкого ряда проблем, в том числе и описанных в данной статье.
На самом деле игры вообще начали создаваться задолго до эпохи PC, вспомнить хоть D&D или WH40K. Программисты лишь дали ещё один инструмент для этого создания, не более.
Понимаете, чем проще что-то создать, тем выше вероятность того, что кто-то это сделает. Чем больше будет тех, кто это сделает, тем выше вероятность того, что это выстрелит и вам понравится.
Из своей практики, например, пиши мы код проекта в стиле ООП ( строго, то есть наследование, полиморфизм, инкапсуляция и все вытекающее) то наши механики с динамически изменяющимся живым миром, в котором существа буквально постоянно анализируют окружающую среду и принимают решения так и остались бы мечтами, т.к. реализовать это «классическими» способами очень сложно, либо получилось бы совсем не то и не в тех масштабах.
Мне, как потребителю, от этого наоборот хуже, потому что я вынужден прилагать больше времени и сил, чтоб найти в этом океане мусора хоть что-то стоящее.
Насчет усилий по поиску… Честно, мне вот например наоборот сам процесс поиска чего-то среди сотен вариантов и параметров нравится больше, чем «выбор» из двух.
Да и вообще развитие науки и техники всегда создавало возможности для творцов, расширяло их.
А вообще, мне кажется как-то уже совсем в философствования ударяемся.)
Программисты пишут любые программы — и в общем не сильно важно банковский это продукт игровой или вообще система по учету наркотрафика для ребят из криминала. Кирпичи везде почти одинаковые.
Так что игры в определенном смысле все таки создают геймдизайнеры и постановщики задач. А вот дальше уже начинается техника.
Не так давно, еще где-то в районе 1995 года, игровому дизайнеру Рафу Костеру потребовалось сперва изучить неизвестный ему язык скриптов (для которого на тот момент и машины виртуальной еще не существовало), затем набить на этом языке дизайн механик и квестов, а после завершения создания виртуальной машины — переписать все заново.
Квесты, предметы, монстры, расположение и поведение НПЦ, навыки и даже связи между локациями в игре Ragnarok Online создаются средствами специального языка для виртуальной машины сервера eAthena.
Я могу очень много таких примеров привести, но не в них суть.
Существует подход под названием DDP (Data-Driven Programming). В рамках этого подхода программа разбивается на уровни ответственности. Чем ниже — тем ближе к кремнию. Чем выше — тем ближе к человеку. Ответственность растет от человека, где она минимальна, в сторону кремния, где ответственность максимально высокая.
Код с высоким уровнем ответственности создается в виде разрозненных и атомарных блоков логики. На среднем уровне задаются правила объединения блоков кода с низкого уровня. А на верхнем уровне правила среднего уровня используются как операторы для написания конкретной бизнес-логики.
При этом, начиная со среднего уровня код программы перестает быть исключительно текстовым: в код включаются машины состояний, графы переходов, деревья поведений, разного рода таблицы с данными, включая даже изображения карт многомерных распределений или карт шумов.
Не уверен. На постановщиках и архитекторах намного больше отвественности. Их ошибка может запороть работу кодеров намного сильнее чем наоборот.
Есть подозрение что ТЗ стоит тоже включить в эту иерархию и тогда код с высоким уровнем пишется вообще на
естественномбюрократическом или экономическом языке.Игра — это прежде всего произведение искусство. А движок и программный код — лишь рабочий инструмент для создания произведения.
Если ты хочешь написать картину, ты можешь взять краски и кисть. (т.е. уже готовые инструменты)
Но если ты задумал в своей картине нечто особое? Например написать картину песком, на ходу изменяя ее? Или линии рисунка должны блестеть металлическим цветом, и быть начертанными углем? Но в магазинах только краски и кисть…
У тебя есть выбор: либо ты рисуешь готовыми красками и кистью. (отказываясь от некоторых идей)
Либо сам создаешь для себя нужные инструмент (перебираешь разные варианты угля для начертания, подбираешь песок нужного цвета с определенным размером песчинок, сам изготавливаешь нужные краски и т.д.) Это может потребовать даже больших сил, чем на создание самого произведения.
С играми то же самое. Готовые инструменты казалось бы дают нам возможность: «бери да твори». Но в то же время ограничивают творцов и не всегда подходят для реализации задуманного…