en:toolworks:docs:apparatus:architecture

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
en:toolworks:docs:apparatus:architecture [2021/06/07 18:29] vladiusen:toolworks:docs:apparatus:architecture [2022/01/05 12:55] (current) – [Iterating] add TODO jispar
Line 1: Line 1:
 ====== Apparatus Architecture Overview ====== ====== Apparatus Architecture Overview ======
  
-Apparatus is a complex tool. It's more of a framework with its own ecosystem then some simple plugin. In order to use it effectively and consciously you have to understand how it actually works. We're not talking about the very specifics of the implementation however but the main top-level architectural concepts. We will begin our acquaintance with a top level "singletonian" entity called //Machine//.+Apparatus is a complex tool. It's more of a framework with its own ecosystem then simple plugin. In order to use it effectively and consciously you have to understand how it actually works. We're not talking about the very specifics of the implementation however but the main top-level architectural concepts. Let us begin our acquaintance with a top level "singletonian" entity called //Machine//.
  
 ===== Machine ===== ===== Machine =====
  
-Machine is the main system of Apparatus. It's a manager for all the things global and thereby is a global singleton itself. It's actually a UObject but its lifespan is defined by its internal state, not the standard garbage collecting procedures. If the Machine has some Mechanicals defined within it or there are still some Subjects in the "scene" it will be retained and remain available. Only when it's no longer needed and becomes meaningless it will be enqueued for a disposal+Machine is the main system of Apparatus. It's a manager for all the things global and thereby is a global singleton itself. It's actually a UObject but its lifespan is defined by its internal state, not the standard garbage collecting procedures. If the Machine has some Mechanisms defined within it, has some active Subjects spawned it will be retained and remain available. Only when it's no longer needed and becomes meaningless it will be enqueued for a disposal.
- +
-Within the Machine in particular and inside Apparatus as a whole, two relating "worlds" exist. These are two levels of ECS data processing with their own unique features and optimizations.+
  
 The [[appi>class_u_machine.html|API documentation page]] for the ''UMachine'' class is of course available for your reference. The [[appi>class_u_machine.html|API documentation page]] for the ''UMachine'' class is of course available for your reference.
 +
 +===== Mechanisms =====
 +
 +//[[en:toolworks:docs:apparatus:mechanism|Mechanisms]]// to Apparatus are what Worlds to Unreal Engine. They provide a somewhat global state, a "scenery" context, comprising Subjects (Subjectives) and the Mechanics operating on them.
 +
 +Mechanisms are bound tight to their (Unrelean) World counterparts. If there are some Mechanics or Subjectives within your ''UWorld'', a Mechanism is created automatically. Of course, you can also obtain it manually or even create a separate (transient) Mechanism instance.
 +
 +Within the Machine/Mechanisms in particular and inside Apparatus as a whole, two relating "worlds" exist. These are two levels of ECS data processing with their own unique features and optimizations.
  
 ===== Low-Level Traits ===== ===== Low-Level Traits =====
  
-Let's start with the lower layer first. The //Traits// subsystem was actually developed later in time, but it's now at the core of the framework and provides the needed functionality for the upper layer to work properly.+Let's start with the lower layer first. The //[[en:toolworks:docs:apparatus:trait|Traits]]// subsystem was actually developed later in time, but it's now at the core of the framework and provides the needed functionality for the upper layer to work properly.
  
 ECS was once developed with performance in mind. Packing and storing the data linearly in memory, what could be simpler? While it's actually not that easy to implement this for dynamically structured entities and requires some sophisticated bookkeeping, the whole notion is correct. The hardware layer of CPUs and RAM is really tailored towards this memory organization. Modern-day CPUs have some large cache capacities which are utilized more efficiently when used with the data pieces stored next to each other. ECS was once developed with performance in mind. Packing and storing the data linearly in memory, what could be simpler? While it's actually not that easy to implement this for dynamically structured entities and requires some sophisticated bookkeeping, the whole notion is correct. The hardware layer of CPUs and RAM is really tailored towards this memory organization. Modern-day CPUs have some large cache capacities which are utilized more efficiently when used with the data pieces stored next to each other.
Line 37: Line 43:
 One of the main technical goals of Apparatus is to effectively process some very large amounts of Subjects and Subjectives (our [[en:toolworks:docs:apparatus:ecs-glossary|own term]] for ECS' Entities) under a specific filter. With that in mind a special concept of //enchaining// was developed. One of the main technical goals of Apparatus is to effectively process some very large amounts of Subjects and Subjectives (our [[en:toolworks:docs:apparatus:ecs-glossary|own term]] for ECS' Entities) under a specific filter. With that in mind a special concept of //enchaining// was developed.
  
-Enchaining is a process of collecting all of the currently available belts and chunks matching a certain filter and embodying them in a special type of array called //Chain//. Chains are managed by the Machine singleton and you won't be creating them manually, even when using the C++ workflow.+Enchaining is a process of collecting all of the currently available Belts and Chunks matching a certain filter and embodying them in a special type of array called //Chain//. Chains are managed by the corresponding Mechanisms and you won't be creating them manually, even when using the C++ workflow.
  
-Instead you have to use global (static) [[appi>class_u_machine.html#a2e5ea120176a0485076c903cc98e6ea2|Enchain methods]], passing them a filter of the desired selection. You can either enchain Belts or Chunks. While they are being enchained and the Chain actually exists the respective Belts or Chunks also remain //locked//.+Instead you have to use Mechanism'[[appi>class_u_mechanism.html#a2e5ea120176a0485076c903cc98e6ea2|Enchain methods]], passing them a filter of the desired selection. You can either enchain Belts or Chunks (together called //Iterables//). While they are being enchained and the Chain actually exists the respective Belts or Chunks also remain //locked//.
  
 ===== Locking ===== ===== Locking =====
Line 49: Line 55:
 ===== Filtering ===== ===== Filtering =====
  
-//Filtering// is an essential part of the proper ECS implementation. It lets you select specific Subjects and Subjectives to work apon. Using the word "select" in this context is not by chance as the term could be very familiar to a database programmer. Technically it's quite the same. You define a "WHERE" clause with a set of conditions to meet. These can be both inclusive (positive) and exclusive (negative).+//[[en:toolworks:docs:apparatus:filter|Filtering]]// is an essential part of the proper ECS implementation. It lets you select specific Subjects and Subjectives to work apon. Using the word "select" in this context is not by chance as the term could be very familiar to a database programmer. Technically it's quite the same. You define a "WHERE" clause with a set of conditions to meet. These can be both inclusive (positive) and exclusive (negative).
  
 Apparatus uses all sorts of different optimization schemes and caches to make the filtering process as fast as possible. You shouldn't worry too much about that. Apparatus uses all sorts of different optimization schemes and caches to make the filtering process as fast as possible. You shouldn't worry too much about that.
- 
-[[appi>struct_f_filter.html|API documentation]] for filters. 
  
 ===== Iterating ===== ===== Iterating =====
  
-Once you have your Subjects spawned and set. Belts or Chunks enchained you're ready to iterate on them to deliver the necessary logic of the game or application. This is done through a very common concept of //Iterators// and //Cursors//.+Once you have your Subjects spawned and set. Belts or Chunks enchained you're ready to //[[en:toolworks:docs:apparatus:iterating|iterate]]// on them to deliver the necessary logic of the game or application. This is done through a very common concept of //Iterators// and //Cursors//.
  
-Both Belt and Chunk have their own types of Iterators, but you would rarely use them directly. Instead you'll almost always use the Chain Cursors. They are essentially Iterators with a naming chosen to eliminate some possible ambiguity. For now you should only use the default (implicit) Cursor as the threading is still a planned feature and you would rarely need to iterate a Belt (or a Chunk) with multiple different Cursors.+Both Belt and Chunk have their own types of Iterators, but you would rarely use them directly. Instead you'll almost always use the Chain Cursors. They are essentially Iterators with a naming chosen to eliminate some possible ambiguity. /* TODO - update this line for current Apparatus version - For now you should only use the default (implicit) Cursor as the threading is still a planned feature and you would rarely need to iterate a Belt (or a Chunk) with multiple different Cursors. */
  
 The API documentation for [[appi>struct_f_chunk_chain.html#a81fe6a135e15ca00736cdd6ef527c3f3|Begin]] and [[appi>struct_f_belt_chain.html#a8552c76ac87bcafb0a8077bbea5ade90|Advance]] methods is provided accordingly. The API documentation for [[appi>struct_f_chunk_chain.html#a81fe6a135e15ca00736cdd6ef527c3f3|Begin]] and [[appi>struct_f_belt_chain.html#a8552c76ac87bcafb0a8077bbea5ade90|Advance]] methods is provided accordingly.
  • en/toolworks/docs/apparatus/architecture.1623079755.txt.gz
  • Last modified: 2021/06/07 18:29
  • by vladius