[HN Gopher] A Simple Entity Component System
       ___________________________________________________________________
        
       A Simple Entity Component System
        
       Author : lordleft
       Score  : 44 points
       Date   : 2022-08-31 18:06 UTC (4 hours ago)
        
 (HTM) web link (austinmorlan.com)
 (TXT) w3m dump (austinmorlan.com)
        
       | djur wrote:
       | The horse is thoroughly out of the barn on this one, but "an
       | Entity Component System" is a misnomer similar to referring to "a
       | Model View Controller". Sometimes it's written as "Entity-
       | Component-System" to clarify that "entities", "components", and
       | "systems" are all concepts within the ECS architecture.
        
         | Hemospectrum wrote:
         | Part of the reason for the confusion is that this is a retcon
         | of sorts. ECS was first described (with a different name) in a
         | postmortem of Dungeon Siege, but as far as I'm aware, the
         | modern usage of "system" was coined by Adam Martin during the
         | development of Operation Flashpoint: Dragon Rising.
         | 
         | There are good technical arguments for making systems into
         | first-class values, of course, but this interpretation will
         | always be in competition with the older one.
        
       | butUhmErm wrote:
       | A simpler ECS pattern in plain C
       | 
       | https://www.gamedev.net/articles/programming/general-and-gam...
       | 
       | See post on C struct composition:
       | https://arpitbhayani.me/blogs/inheritance-c
        
       | cloogshicer wrote:
       | Something I don't get about ECS: How do you handle interactions
       | between systems, and especially side effects that can affect
       | multiple systems?
       | 
       | Because of those, the systems can't really be considered truly
       | independent, can they?
       | 
       | Doesn't this cause complexity to go through the roof?
        
         | kvark wrote:
         | In some ECS in Rust (like Specs) there is a concept of a
         | "resource" for this. System declare their use of resources,
         | which allows the scheduler to order them.
        
       | stephc_int13 wrote:
       | ECS is a one of the possible designs of what we usually call "the
       | gamestate" that is the dynamic structure that holds the game
       | world simulation.
       | 
       | But the origin of ECS is Data Oriented Design, also known as DOD,
       | that emerged as a reaction to the bad properties of OOP.
       | 
       | DOD is more general and IMHO more interesting than ECS.
       | 
       | I have not yet seen a satisfying implementation of ECS, it can be
       | extremely fast compared to OOP approach, but also cumbersome when
       | dealing with dependencies between systems and the ways to handle
       | structural changes.
       | 
       | My take would be : learn the principles, do some benchmark, but
       | do not consider any ECS implementation as gospel, this is not
       | mature yet.
       | 
       | Use the ideas and principles to build a fast simulation in your
       | own way.
        
         | drittich wrote:
         | I agree - I have looked into a 2 or ECS implementations, and
         | they either seemed awkward, or brought in a bunch of other
         | concerns I did not care about, and in the end decided to roll
         | my own for some games I was building. It was pretty simple in
         | the end. Dependencies definitely became a bit lengthy in some
         | cases, but I didn't hate that, in that it makes the coupling
         | explicit.
        
           | stephc_int13 wrote:
           | I think that systems should be updated in a very explicit
           | order, so that dependencies are easier to manage.
           | 
           | And for the multithreaded usage, a parallel_for can be used
           | to update systems.
        
       | efnx wrote:
       | There are some really interesting ECS implementations popping up
       | in Rust, like apecs[0], which supports async systems.
       | 
       | 0: https://crates.io/crates/apecs
        
       | contravariant wrote:
       | That's certainly an interesting way to organize things, though I
       | dislike the reliance on several 'manager/coordinator' classes.
       | (though part of this is my superstition that class names
       | shouldn't end in -er or -or)
       | 
       | The main mechanism seems to be for 'systems' being able to
       | iterate over tuples of 'components' of a specific type for all
       | 'entities'. I can't help but wonder if there isn't a more elegant
       | way of doing this than trying to keep the set of entities for
       | each system up to date. Though I suppose it depends on what you
       | want to optimize.
        
         | sparkie wrote:
         | One of the main goals of ECS is to improve the use of the cache
         | and reduce the amount of dereferencing.
         | 
         | An alternative approach, which does not sacrifice the more
         | common OOP style:
         | https://www.doc.ic.ac.uk/%7Escd/ShapesOnwards.pdf
        
           | contravariant wrote:
           | Is that really what you get when you put all entity IDs in a
           | set and iterate over those? Sure the component arrays are
           | packed but that's kind of pointless if you're iterating over
           | them in a random order (note that the system proposed here
           | will also gradually destroy the ordering in the packed
           | arrays).
           | 
           | Not that I know an easy way to keep a lists of components
           | that ensure that iterating over them is anywhere close to
           | cache-efficient. Perhaps some kind of self-ordering system
           | would work? (you could for instance move components to
           | consecutive positions as a system uses them, ideally in way
           | that's _stable_ so you don 't mess up the ordering of other
           | systems)
        
       | robertlagrant wrote:
       | Might be a misread, but this feels a little similar to relational
       | vs columnar databases. Relational databases store a thing's data
       | together; columnar store a type of data together.
        
         | sparkie wrote:
         | A relational DB can store data however it wants, including
         | columnar formats. The interface presented to the programmer
         | (SQL) just abstracts away the details.
         | 
         | ECS are more similar to the relational model than OOP is, and
         | do not necessarily suffer the same 'object-relational impedance
         | mismatch'.
        
       | [deleted]
        
       | erichocean wrote:
       | Bevy[0] (written in Rust) has a fairly mature ECS implementation.
       | 
       | [0] https://bevyengine.org/
        
       | hcarvalhoalves wrote:
       | IMO, ECS is a better way of doing OO (even on a non-OO language)
       | than OO languages themselves:
       | 
       | - Avoid the inheritance vs. composition issue
       | 
       | - Entity as a first-class concept (no more Object vs. "Just Value
       | Object", confusion regarding equality of objects, object hash
       | methods)
       | 
       | - System as a first-class concept (not just a consequence of a
       | call stack between multiple inter-dependent objects)
       | 
       | - It serves much of the same purpose of the Flyweight Pattern
       | 
       | - Naturally conductive of functional programming
       | 
       | This particular implementation is interesting, it introduces some
       | additional pieces (Component Manager, System Manager).
        
         | ummonk wrote:
         | One of the core tenets of OO is encapsulation. ECS rightly
         | treats encapsulation as a bad thing, because data (i.e.
         | entities) should not be encapsulated in the components and
         | systems which operate on them.
        
         | drittich wrote:
         | I have a similar feeling, but have not converted that feeling
         | into building production code that way yet, partially because
         | it conflicts with a large amount of existing code that I work
         | on in terms of design. It definitely has tradeoffs, but I found
         | a large class of problems went away when I used it.
        
         | klabb3 wrote:
         | I've read up on ECS thrice now, (but never used it because I
         | don't do games) and I really WANT to like it, and I feel it
         | does have value in other domains.
         | 
         | But... I realize every time that I forget what an entity,
         | component and system really "is" (i mean to be fair the naming
         | is almost satire of genericness), and the abstraction doesn't
         | stick to my brain in a way that I had hoped. Kinda similar to
         | how monads don't stick, and fades away over time (if you're not
         | doing FP). Usually, this is a red flag for abstractions, but
         | perhaps the material I've read has been poorly written. Does
         | this feeling go away when you're used to it? Does it just feel
         | natural and obvious after a while?
        
         | politician wrote:
         | That's a really interesting take. I'd love to see an
         | experimental language based around this approach because I
         | think it could really push your idea much further than a
         | library.
        
       | brochington wrote:
       | I would love to see some exploration of the ECS pattern being
       | used for web development. A couple years ago I wrote an
       | experiment[0] using ECS with Web Components to make a simple
       | calculator, and... it was actually pretty nice. ECS does a great
       | job of flattening nested structures, and would be really curious
       | if this would improve things like prop drilling in React.
       | 
       | 0: https://brochington.github.io/ecstatic-doc-
       | site/docs/example...
        
         | ummonk wrote:
         | Fundamentally, UI is nested. The framework has to reflect this
         | and make UI components composable in a bested way or you'll
         | drive developers crazy.
         | 
         | What I do wonder about is being able to use a data oriented
         | system that does reflect this neat ability. E.g. if the data in
         | an ECS system is viewed as a simplified relational database,
         | what would happen if we replaced it with a simplified graph
         | database?
        
       ___________________________________________________________________
       (page generated 2022-08-31 23:00 UTC)