ru:toolworks:docs:apparatus:ecs

Различия

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

Ссылка на это сравнение

Следующая версия
Предыдущая версия
Последняя версияСледующая версия справа и слева
ru:toolworks:docs:apparatus:ecs [2021/04/16 12:25] – создано. надо перевести jisparru:toolworks:docs:apparatus:ecs [2021/04/21 02:03] – Закончил jispar
Строка 3: Строка 3:
 ===== Причуды и ограничения ООП ===== ===== Причуды и ограничения ООП =====
  
-Прежде  +Прежде чем переходить к обсуждению ECS, стоит обратиться к [[wp>Object-oriented_programming|Объектно-ориентированному программированию (ООП)]] и его проблемамтак как пользовательский API Unreal Engine'а основан именно на парадигмах ООПActor-component модель тоже, в некотором смысле, ограничена, и по своей натуре в большей степени является статичной
-Prior to discussing some ECS conceptswe have address the [[wp>Object-oriented_programming|object-oriented programming (OOP)]] and its issuessince the current state of Unreal Engine's user-level API is basically OOP-basedThe actor'component model is also kind of limited and is mostly static in nature.+
  
-While developing games (and software in generalOOP-waywe decompose of all the available entities and concepts into hierarchies of their corresponding typesIn terms of Unreal Engine those are mainly called Objects, or [[ue>API/Runtime/CoreUObject/UObject/UObject|''UObjects'']] if we are talking about C++ codingso we create hierarchies of types (classesderived from a single root ''UObject'' ancestorEvery time we create a new Blueprint (or a C++ classit basically derives from this root class.+Программируя игры (или программное обеспечение вообщев стиле ООПмы разбиваем всевозможные сущности и концепции в иерархию их соответствующих типовВ терминах Unreal движка все эти абстракции называются Объектами (или [[ue>API/Runtime/CoreUObject/UObject/UObject|''UObjects'']], если мы говорим про С++ составляющую). Итакмы создаём иерархию типов (классов), наследовавшись от единого корня - ''UObject'' предкаКаждый созданный новый блупринт (или С++ классявляется наследником этого базового класса.
  
-As the time goes we notice that our classes become more and more in common and begin to [[wp>Code_refactoring|refactor]] the codebase (or the Blueprint assets), while extracting those common facilities into some separate base classesThose in turn become the ancestors and we derive certain types from themthat should share their functionality. +Время идёт и мы замечаем, что наши классы начинают всё более и более походить друг на друга, тогда мы проводим так называемый [[wp>Code_refactoring|рефакторинг]] кода (или Blueprint-ассетов), выделяя схожие свойства в отдельный базовый классПоследнийв свою очередьстановится предком и мы наследуем от него новые типыкоторые должны предоставлять определённую функциональность.
- +
-A quite popular example for that approach is a tree of animal inheritancewhere a root class represents basically any animal existing (something like ''UObject'')while others derived represent some separate animal sorts and kinds on their own:+
  
 +Довольно известный пример этом подходу - дерево наследования животных, где классом-корнем выступает абстракция, представляющая собой любое живое существо (аналог ''UObject''), а остальные абстракции являются отдельными животными видами:
 {{ :en:toolworks:docs:oop-example.jpg?nolink |}} {{ :en:toolworks:docs:oop-example.jpg?nolink |}}
  
-The descendant types inherit the properties of their respective base typesso by altering the base class properties we also change the current state of the objectsif they are of some derived descendant typeWe can also introduce some [[wp>Virtual_function|"virtual"]] overridable methods to be able to modify their behavior in the derived classes. +Потомственные типы наследуют свойства их соответствующих базовых типовитаким образом, изменяя свойства базового класса, мы также меняем поведение всех потомковМы можем так же ввести такую технологию, как "перегружаемые методы" ([[wp>Virtual_function|"virtual overridable methods"]])чтобы иметь возможность переопределять тела функций в классах-потомках.
- +
-All of that functionality surely look quite useful and niceisn't it? Well yes it is, until you have like 100 classes. The problem here is that your game logic becomes too scattered across the class-layers in the hierarchy. You tend to forget what is defined on what level, what is overridable and what's not. The amount of coupling between the entities becomes scary and error-prone. Your coding partners who wrote some aspect of the base classes, become the keepers of some "secret knowledge". The time of refactoring sky-rockets for this every-growing hierarchy. This "ceremonial" job becomes your job itself, but not the development of the final end-user features. Not a good thing at all, considering how limited the time and resources can be. +
- +
-===== ECS to The Rescues =====+
  
-A solution to this hassle could be an approach called [[wp>Entity_component_system|Entity–component–system (or ECS for short)]].+Весь этот кипишь выглядит довольно неплохо, разве нет? Да, всем этим можно пользоваться, но пока у вас нету, например, 100 классов. Проблема в том, что игровая логика становится очень размазанной по всем уровням иерархии. Вы всё чаще забываете, что было определено в конкретном классе, какие методы можно перегружать, какие нет. Количество взаимосвязей увеличивает возможность ошибки, а неразбериха только усугубляется. Ваши коллеги, которые писали код некоторых из используемых классов, становятся хранителями каких-то "тайных знаний". С ростом дерева классов время, требуемое на рефакторинг, увеличивается с экспоненциальной скоростью. Этот "ритуал" становится неотъемлемой частью работы, но к самой разработке утилит для целевого пользователя всё это мало относится. Совершенно неприемлемый подход, учитывая то, как ограничено бывает время и ресурсы.
  
-There are no hierarchies in terms of ECS, as every game object (i.e. //entity//) is basically flat in its nature. It consists of data-only parts called //components//. You can combine those arbitrary on a per-entity basis.+===== Спасительный ECS =====
  
-Want your RPG character become a poison damage dealer? Add a ''poisonous'' component to it and consider it doneas long as you also implement a //system// that actually solves the poison mechanic.+Решением этих хлопот может быть такой подходкак [[wp>Entity_component_system|Entity–component–system (или кратко - ECS)]].
  
-Systems are remote to the details they operate upon. That's also a feature of ECS. They are like distant code blocks that take certain details as their operands and evaluate a certain resultSystems are run after other systems and together they form a complete pipeline of your game.+В ECS нету никаких иерархий, каждый объект игры (т.е. //сущность//) изначально нейтральныйОн состоит только из частей данных, называемых //компонентами// (или //деталями//)Вы можете комбинировать их на конкретной сущности произвольным образом.
  
-That's basically it. But how come such a useful concept is not implemented in Unreal Engine yetWellit actually istake Niagara as an example. The rendering pipeline can also be considered a pipeline. In other wordsthat may be all sorts of specific data-driven approaches taken in Unreal Enginebut none of them are as general-purpose as its OOP natureWe provide such approach for any of the user-available side of the Engine!+Вы хотите дать своему RPG-герою возможность наносить урон ядомПросто добавьте компонент "отравляющий" исчитайдело сделано; конечноесли была реализована соответствующая //система//которая эту логику определяет.
  
-Make sure your read our [[en:toolworks:docs:apparatus:ecs-glossary|Apparatus to ECS Glossary]] to get to know our terminology.+Система это удалённый агент, оперирующий над деталями. Это также особенность ECS. Системы представляют собой что-то наподобие внешнего кода, который берёт определённые компоненты-детали, как свои входные данные, и, оперируя над ними, возвращает результат. Системы выполняются одна за другой и вместе формируют то, что называется игровым механизмом.
  
-==== About ECS+ ====+На этом всё. Но как такой простой, удобный и гибкий принцип не был реализован в Unreal Engine до сих пор? Ну, на самом деле был: возьмите Niagara, например. Устройство рендера так же может быть рассмотрено как разработанный софт. Другими словами, какие сорта специальных data-ориентированных подходов в UE не возьми, ни один из них не является настолько выделенным, как ООП-подход. Мы же предоставляем новый принцип, универсальный для всех инструментов разработчика!
  
-Apparatus takes a broader approach on ECS that we essentially call ECS+ over here. It introduces a greater amount of flexibility with the help of detail (component) inheritance support and sparse expandable, dynamic belts (chunks and archetypes), subject (entity) bootingetc. The term ECS+ in itself should be treated as more of a synonym for the "Apparatus" wording itselfsince the product actually implements it and uses a different terminology from the ground up.+Убедитесь в томчто вы читали [[ru:toolworks:docs:apparatus:ecs-glossary|Словарь Apparatus]]чтобы узнать вводимые нами новые термины.
  
-Generally speaking, in our own development philosophy, engineering should never be "pure" or "mathematically correct" but mainly applicable and useful to the end user and/or the developer. Unreal Engine in itself is actually good demonstration of this approach with so many special cases and design patternsBy having both OOP and ECS patterns combined Apparatus takes the best of three worldswith UE's blueprint world counted.+==== Про ECS+ ==== 
 +/*It introduces greater amount of flexibility with the help of detail (component) inheritance support and sparse expandable - sparse expandable не понял*/ 
 +Apparatus берёт более широкое направление, чем обычный ECS, поэтому мы и называем его ECS+Вводится бóльшая гибкость, имеется поддержка наследования деталей (компонентов), динамические belt-ы (//chunks// и //archetypes//), subject-booting и др. Само понятие ECS+ должно рассматриваться как синоним слову "Apparatus"так как плагин, на самом деле, реализует и полноценно использует именно эту терминологию с самого своего начала.
  
 +Вообще говоря, в нашей философии разработки, проектирование никогда не должно быть "простым" или "математически корректным", но напротив более применимым и удобным в использовании как для конечного пользователя, так и для программиста. Unreal Engine, конечно, является хорошим примером такого подхода со всеми своими концепциями и паттернами. Соединяя в себе оба паттерна ООП и ECS, Apparatus включает всё самое лучшее из 3-х миров, считая мир UE-блупринтов.
  
-==== Built-in Subjects ====+==== Встроенные сущности ====
  
-At a lower level, ''Subjective'' is an interface and any class that implements it may be called a ''Subject''There are several subjects already implemented in the framework:+На низком уровне, ''Subjective'' - это интерфейс, и любой класс, который его имплементирует, может быть назван сущностьюЕсть несколько уже встроенных в плагин subject'ов:
  
-  * ''SubjectiveActorComponent'' (based on ''ActorComponent''),  +  * ''SubjectiveActorComponent'' (на базе ''ActorComponent''),  
-  * ''SubjectiveUserWidget'' (based on ''UserWidget''), +  * ''SubjectiveUserWidget'' (на базе ''UserWidget''), 
-  * ''SubjectiveActor'' (based on ''Actor'').+  * ''SubjectiveActor'' (на базе ''Actor'').
  
-Those should be sufficient for the most casesbut you can easily implement your own additional subject classes in C++.+Этого должно хватить в подавляющем большинстве случаев использованияно вы, естественно, можете реализовать свои subject-классы в C++.
  
-==== Built-in Mechanisms ====+==== Встроенные механизмы ====
  
-The ''Mechanical'' class is also an interfacewith the most useful mechanisms already implemented+Класс ''Mechanical'' - это также интерфейсс уже реализованными основными механизмами
  
-  * ''MechanicalActor'' (inherited from ''Actor''),+  * ''MechanicalActor'' (наследованный от ''Actor''),
   * ''MechanicalGameModeBase'' (''GameModeBase''),   * ''MechanicalGameModeBase'' (''GameModeBase''),
   * ''MechanicalGameMode'' (''GameMode'').   * ''MechanicalGameMode'' (''GameMode'').
  
-You would hardly ever need to implement your own mechanismsShould you wish toyou can also do it in C++.+Вряд ли вам потребуется дополнять функционал своими механизмамиЕсли такая потребность возникнетвы также можете достичь этого при помощи C++.
  • ru/toolworks/docs/apparatus/ecs.txt
  • Последнее изменение: 2021/12/18 15:19
  • jispar