11

Переход от ООП к ECS при разработке игр

Когда-то у меня было мало опыта в разработке и я решил - буду делать игру, используя ООП.
Это ведь популярная парадигма разработки.
И сделал. Я придумал достаточно оригинальную идею игры, реализовал базовую механику за пару недель и убедился что игра жизнеспособна.

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

Спустя несколько лет я накопил опыта и познакомился с паттерном ECS (Entity-Component-System). Он решает задачу улучшения гибкости, модульности и производительности систем. Вспомнил про игру и пошёл искать библиотеку ECS для python (игра на нем).Сущеуствующие библиотеки ECS для python оказались не идеальны, если сказать мягко.

В итоге я написал свою реализацию:
https://github.com/ikvk/ecs_pattern
https://pypi.org/project/ecs-pattern/
И воспользовался ей для создания своей игры.
Использование ECS дало свои плоды: писать код стало в удовольствие, появилась гибкость и модульность.

ECS для разработки игр прекрасен на любом языке.
Если вы делаете игру, для которой не нужна видеокарта, вам может пригодиться мой опыт.
В репозитории бибилотеки ecs_pattern есть краткие доки, пример использования на примере моей игры и еще пара полезных примеров.
На низкоуровневых языках ECS решает задачу оптимизации использования ресурсов, но это уже совсем другая история.

*Игра называется "Trig fall", размещена в rustore, vkplay, appgallery.

Спасибо за внимание :)

Больше постов читайте по тегу «Программирование». А если хотите изучить новую профессию, посмотрите актуальные курсы от проверенных школ с реальными отзывами на сайте Пикабу Курсы.

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

1
Автор поста оценил этот комментарий

Ты бы еще PHP взял, а потом жаловался, что оно кривое.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

На чем пишите, ваша светлость? )

показать ответы
0
Автор поста оценил этот комментарий

Кхм, ну начинать тогда можно и с турбопаскаля=)))

Начинать можно с чего угодно что сердцу милее, но все же стоит учитывать два момента -- новички часто вообще не понимают куда им податься (не просто так всякие древа знаний клепают типа "путь в профессию" и прочее), а что еще нужно учитывать и что крайне важно -- это психологический момент -- ну начинаем мы тот же с++ давать новичку, так вот он охует уже с первых строк своего кода (ну помимо привет мир), потому что сразу столкнется с тем что ему нужно начать свою соображалку включать еще до того как он что-то там написал (а если новичок и вовсе без какой-то базы?) -- что вызвать, что объявить и потом еще куда-то это деть и все блятские точки с запятыми расставить -- не полет творчества, а облом сплошной. И с самого начала одна теория, теория, пока злосчастный калькулятор (что угодно подставить из того что там новички пишут) начнешь писать, охренеешь настолько, что возможно до калькулятора дело не дойдет вовсе.

Именно поэтому пайтон и считается хорошим выбором для новичка, он на первых порах не заставляет забивать голову всем подряд в том числе и выбором направления куда потом бечь, он дает возможность войти в программирование плавно и очень ласково (на сравнении), то что в этих спокойных водах куча подводных камней, узнается потом, а до того момента как это "потом" наступит, человек уже нахватается какого никакого опыта и знаний, что позволит нырять в другие темные омуты с шансом не утонуть сразу, а еще потрепыхаться немного. Оставаться на пайтоне выше начального уровня и общего понимания -- нужно лишь тем кому нужен именно пайтон (но еще, конечно, стоит раз 10 подумать, нет ли иных вариантов).

Ну я же вам не просто так в первом комменте написала про шарп=)) а если точнее направила в юнити (может не прямым текстом, но намек был толстый). Там эти паттерны и водятся, вы бы открыли и точно бы столкнулись с EC уже с первых нот, оно как бы само и естественно и вопросов бы меньше было. А так выходит вы все заново "сочинили", в этом нет ничего плохого даже плюсы имеются (иные просто бездумно юзают если сразу с юнити начинают и даже не думают что может быть иначе, что тоже минусы имеет), но просто времени больше потратили.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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

Не ругайтесь, вам это будет в плюс, я рад что вы уделили мне внимание.

показать ответы
1
Автор поста оценил этот комментарий

хрен поспоришь :D
Но развите таки претендует на оригинальность.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

*развитие

0
Автор поста оценил этот комментарий

Классическое ООП не подходит для разработки игр.

Потому что куски памяти по которым нужно пройтись каждый цикл лежат в памяти не ровно.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

в мире питона все лежит неровно и без разницы, в мире серьезных игр - там да

3
Автор поста оценил этот комментарий

Я придумал достаточно оригинальную идею игры

Спойлер: оригинальная идея - это тетрис

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

хрен поспоришь :D
Но развите таки претендует на оригинальность.

показать ответы
0
Автор поста оценил этот комментарий
Есть в базовой библиотеке такая штука, нужна для создания оконных приложений на питоне. Многие эту либу ненавидят, т.к. она изначально спроектирована схожим образом, как один объект и ничего хорошего из этого конечно же не вышло.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, я использовал её однажды. В книге про паттерны даже есть упоминание о tkinter как пример плохой архитектуры. (Приемы объектно-ориентированного проектирования. Паттерны проектирования)

0
Автор поста оценил этот комментарий
ошибка tkinter'а
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

?

показать ответы
0
Автор поста оценил этот комментарий

Пайтон очень многое позволяет, например писать не чистым ООП, вообщем новичку наломать дров и запутаться очень легко. Можно конечно такое и в шарп попытаться сделать, только чтобы такое устроить в шарп надо еще голову поломать как=)) Поэтому с шарп сидишь и изначально все продумываешь, приходиться больше разбираться с классами, доступами, инкапсуляцией, переменные разбирать, структуру продумывать, проверкам время уделить и т.д То что в пайтоне на начальных этапах редко кто голову забивает ( и оно конечно же потом все вылезает боком). Вообщем из-за особенностей самого языка есть шансы избежать самых очевидных граблей, он просто заставляет сесть и немного больше подумать над тем что за хрень ты пишешь что и куда у тебя пойдет, где и как будет использовано, конечно же от всех ошибок и проблем это не убережет, но все же приучает чуть к другому подходу, чуть к другому программированию изначально. Именно поэтому советуют начать с пайтона как базового (чтобы интерес не отбить), но потом, как в основы вникаешь перейти на что-то более "строгое" на практике, с# для этого хорошо подходит, потому что все же попроще для понимания и поинтереснее на началах чем java или c++.

Серьезное, не серьезное, на пайтон можно и "серьезное" писать, смотря что подразумевать под "серьезным", если имеется в виду нагрузка, типа что-то объемное и должно быстро фурычить, то конечно пайтон проиграет c# (вот насчет проиграет ли c# с++ -- тут от прямоты рук зависит и от того что конкретно пишется). У с# есть свои преимущества, а есть и свои недостатки, но именно для игр он хорошо подходит.


Что бы делать успешные игры можно вообще ничего не учить (имеется в виду глубоко не нырять), сейчас многое можно собирать практически из готового, главное идея самой игры, есть куча игр (механик), которые не требуют семи пядей во лбу чтобы их написать -- т.е важнее всего именно сама игра, насколько она получится реиграбельной и сколько времени будут игроки в ней проводить, а не сложность и красота кода и на чем она там написана=)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

«Существует лишь два вида языков программирования: те, которые постоянно ругают, и те, которыми никто не пользуется»

Начинать с пайтона это плохой совет. Начать программировать хорошо с СИ.
Я не предлагал новичкам использовать питон. Питон это НЕ базовый язык, тут абстракции самого высокого уровня. Скорее всего на питоне вы писали очень мало.

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

Посыл мой статьи - используйте ECS на любом языке. Цитата: "ECS для разработки игр прекрасен на любом языке." А вы рубитесь за шарп - да хоть лисп.

показать ответы
1
Автор поста оценил этот комментарий

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

Писали бы, например, на С# и никаких бед бы не знали=))) Потому что вам сам язык ограничил бы и требовал бы прописывать и разрабатывать структуру от и до понимая как оно будет развиваться и расти, а не как попало =))))

А если серьезно, ну не пишите вы на пайтоне игры, так себе затея, зачем так все усложнять для себя, получится рано или поздно, но будете все методом набивания шишек добирать. С# -- и вперед (тот же юнити). С++ не предлагаю, хотя может он вам понравится больше, просто он сложнее..

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Можно было короче: "не знаешь язык и основы - сначала выучи, а потом пиши игры". Все верно.

Шарп никак не решает архитектурных проблем при разработке игр.

Чтобы делать серьезные игры, надо учить не шарп а си, с++, asm, математику, можно и раст.

показать ответы
0
Автор поста оценил этот комментарий

Путал , ecs это уже движок в любой реализации , а не просто принцип

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Можно называть ECS подходом, шаблоном, принципом, но это точно не движок.
Интернеты в основном слогласны.

https://en.wikipedia.org/wiki/Entity_component_system

Entity Component System (ECS) - это программный архитектурный шаблон, который в основном используется в разработке видеоигр для представления объектов игрового мира.

показать ответы
1
Автор поста оценил этот комментарий

Я сильно подозреваю, что ты пытался писать процедурный код с использованием ООП, и потому ловил все эти грабли. ООП это не просто использование классов и экземпляров, это еще и определенные паттерны разработки. Ты вот что использовал, какой подход?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Я пытался сделать супер объект "игра", который содержал все логические состояния самой игры и ничего не знал о своем визуальном представлении. Это было больно.

В описании либы есть упоминание о том что ECS не надо возводить в абсолют.

показать ответы
0
Автор поста оценил этот комментарий

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


Особенно учитывая что ты подход с движком путаешь

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

1. Я не путал джижок и паттерн, писал без движка - игра мелкая
2. ECS неплохо решает проблему очередности, а за синхронностью логики и тп следит программист, это непросто. Если у вас есть конструктив по этому поводу - поделитесь пожалуйста

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества