← Back to results

HTTP/1

.1 200 OK date: Fri, 03 Jul 2026 00:10:15 GMT server: ATS/9.2.13 x-content-type-options: nosniff content-language: en accept-ch: reporting-endpoints: csp-report-to-endpoint='/w/api.php?action=cspreport&format=json'; content-security-policy: script-src 'unsafe-eval' blob: 'self' meta.wikimedia.org *.wikimedia.org *.wikipedia.org *.wikinews.org *.wiktionary.org *.wikibooks.org *.wikiversity.org *.wikisource.org wikisource.org *.wikiquote.org *.wikidata.org *.wikifunctions.org *.wikivoyage.org *.mediawiki.org mediawiki.org wikimedia.org *.wmflabs.org *.wmcloud.org *.toolforge.org wss://*.toolforge.org *.jsdelivr.net unpkg.com cdnjs.cloudflare.com raw.githubusercontent.com *.github.com code.jquery.com cdn.mathjax.org use.typekit.net fonts.cdnfonts.com use.fontawesome.com i.ytimg.com rsms.me doi.org localhost https://localhost:* http://localhost:* wss://localhost:* ws://localhost:* *.google.com *.gstatic.com *.googleapis.com *.translate.yandex.net yastatic.net ya.ru radically.github.io cdn.sammdot.ca cdn.fontshare.com viaf.org publicai-proxy.alaexis.workers.dev iiif.archive.org api.flickr.com live.staticflickr.com api.anthropic.com api.openai.com api.publicai.co catalogo.pusc.it parsifal.urbe.it opac.sbn.it overpass-api.de api.openrouteservice.org archive.org *.openstreetmap.org *.waymarkedtrails.org *.thunderforest.com registry.ipe.wiki analytics.ipe.wiki qlever.dev app.goacoustic.com wikipedia-archive.ourworldindata.org api.inaturalist.org inaturalist-open-data.s3.amazonaws.com validator.w3.org db.onlinewebfonts.com fontlibrary.org 'unsafe-inline' auth.wikimedia.org; default-src 'self' data: blob: upload.wikimedia.org https://commons.wikimedia.org meta.wikimedia.org *.wikimedia.org *.wikipedia.org *.wikinews.org *.wiktionary.org *.wikibooks.org *.wikiversity.org *.wikisource.org wikisource.org *.wikiquote.org *.wikidata.org *.wikifunctions.org *.wikivoyage.org *.mediawiki.org mediawiki.org wikimedia.org *.wmflabs.org *.wmcloud.org *.toolforge.org wss://*.toolforge.org *.jsdelivr.net unpkg.com cdnjs.cloudflare.com raw.githubusercontent.com *.github.com code.jquery.com cdn.mathjax.org use.typekit.net fonts.cdnfonts.com use.fontawesome.com i.ytimg.com rsms.me doi.org localhost https://localhost:* http://localhost:* wss://localhost:* ws://localhost:* *.google.com *.gstatic.com *.googleapis.com *.translate.yandex.net yastatic.net ya.ru radically.github.io cdn.sammdot.ca cdn.fontshare.com viaf.org publicai-proxy.alaexis.workers.dev iiif.archive.org api.flickr.com live.staticflickr.com api.anthropic.com api.openai.com api.publicai.co catalogo.pusc.it parsifal.urbe.it opac.sbn.it overpass-api.de api.openrouteservice.org archive.org *.openstreetmap.org *.waymarkedtrails.org *.thunderforest.com registry.ipe.wiki analytics.ipe.wiki qlever.dev app.goacoustic.com wikipedia-archive.ourworldindata.org api.inaturalist.org inaturalist-open-data.s3.amazonaws.com validator.w3.org db.onlinewebfonts.com fontlibrary.org en.wikibooks.org en.wikinews.org en.wikiquote.org en.wikisource.org en.wikiversity.org en.wikivoyage.org en.wiktionary.org www.mediawiki.org commons.wikimedia.org foundation.wikimedia.org incubator.wikimedia.org species.wikimedia.org wikimania.wikimedia.org www.wikidata.org www.wikifunctions.org auth.wikimedia.org; style-src 'self' data: blob: upload.wikimedia.org https://commons.wikimedia.org meta.wikimedia.org *.wikimedia.org *.wikipedia.org *.wikinews.org *.wiktionary.org *.wikibooks.org *.wikiversity.org *.wikisource.org wikisource.org *.wikiquote.org *.wikidata.org *.wikifunctions.org *.wikivoyage.org *.mediawiki.org mediawiki.org wikimedia.org *.wmflabs.org *.wmcloud.org *.toolforge.org wss://*.toolforge.org *.jsdelivr.net unpkg.com cdnjs.cloudflare.com raw.githubusercontent.com *.github.com code.jquery.com cdn.mathjax.org use.typekit.net fonts.cdnfonts.com use.fontawesome.com i.ytimg.com rsms.me doi.org localhost https://localhost:* http://localhost:* wss://localhost:* ws://localhost:* *.google.com *.gstatic.com *.googleapis.com *.translate.yandex.net yastatic.net ya.ru radically.github.io cdn.sammdot.ca cdn.fontshare.com viaf.org publicai-proxy.alaexis.workers.dev iiif.archive.org api.flickr.com live.staticflickr.com api.anthropic.com api.openai.com api.publicai.co catalogo.pusc.it parsifal.urbe.it opac.sbn.it overpass-api.de api.openrouteservice.org archive.org *.openstreetmap.org *.waymarkedtrails.org *.thunderforest.com registry.ipe.wiki analytics.ipe.wiki qlever.dev app.goacoustic.com wikipedia-archive.ourworldindata.org api.inaturalist.org inaturalist-open-data.s3.amazonaws.com validator.w3.org db.onlinewebfonts.com fontlibrary.org 'unsafe-inline'; object-src 'none'; report-uri /w/api.php?action=cspreport&format=json; report-to csp-report-to-endpoint last-modified: Wed, 01 Jul 2026 01:05:01 GMT content-type: text/html; charset=UTF-8 age: 0 accept-ranges: bytes x-cache: cp2047 hit, cp2047 miss x-cache-status: hit-local server-timing: cache;desc="hit-local", host;desc="cp2047" strict-transport-security: max-age=106384710; includeSubDomains; preload report-to: { "group": "wm_nel", "max_age": 604800, "endpoints": [{ "url": "https://intake-logging.wikimedia.org/v1/events?stream=w3c.reportingapi.network_error&schema_uri=/w3c/reportingapi/network_error/1.0.0" }] } nel: { "report_to": "wm_nel", "max_age": 604800, "failure_fraction": 0.05, "success_fraction": 0.0} set-cookie: WMF-Last-Access=03-Jul-2026;Path=/;HttpOnly;secure;Expires=Tue, 04 Aug 2026 00:00:00 GMT set-cookie: WMF-Last-Access-Global=03-Jul-2026;Path=/;Domain=.wikipedia.org;HttpOnly;secure;Expires=Tue, 04 Aug 2026 00:00:00 GMT set-cookie: WMF-DP=07f;Path=/;HttpOnly;secure;Expires=Fri, 03 Jul 2026 00:00:00 GMT x-client-ip: 75.28.18.94 cache-control: private, s-maxage=0, max-age=0, must-revalidate, no-transform vary: Accept-Encoding,X-Subdomain,Cookie,Authorization,User-Agent set-cookie: GeoIP=US:TX:McKinney:33.20:-96.62:v4; Path=/; secure; Domain=.wikipedia.org set-cookie: NetworkProbeLimit=0.001;Path=/;Secure;SameSite=None;Max-Age=3600 set-cookie: WMF-Uniq=DyVg-hJ4cRwJVbPwBAvGnwOSAAAAAFvdJ4-LnETuaTcmV8lYW9s36bgLj-fL6D-6;Domain=.wikipedia.org;Path=/;HttpOnly;secure;SameSite=None;Expires=Sat, 03 Jul 2027 00:00:00 GMT content-length: 120298 x-request-id: 4e8f6962-8480-4889-bbb6-c24053bb2d5b x-analytics: Entity component system - Wikipedia Jump to content Main menu Main menu move to sidebar hide Navigation Main page Contents Current events Random article About Wikipedia Contact us Contribute Help Learn to edit Community portal Recent changes Upload file Special pages Search Search Appearance Donate Create account Log in Personal tools Donate Create account Log in Contents move to sidebar hide (Top) 1 Characteristics 2 History 3 Variations Toggle Variations subsection 3.1 Martin's ECS 3.2 The Unity game engine 4 Common patterns in ECS use 5 See also 6 Notes 7 References 8 External links Toggle the table of contents Entity component system 7 languages Español فارسی Magyar 日本語 Polski Português Українська Edit links Article Talk English Read Edit View history Tools Tools move to sidebar hide Actions Read Edit View history General What links here Related changes Upload file Permanent link Page information Cite this page Get shortened URL Print/export Download as PDF Printable version In other projects Wikidata item Appearance move to sidebar hide From Wikipedia, the free encyclopedia Software architectural pattern mostly used in video game development This article is written like a personal reflection, personal essay, or argumentative essay that states a Wikipedia editor's personal feelings or presents an original argument about a topic. Please help improve it by rewriting it in an encyclopedic style . ( October 2013 ) ( Learn how and when to remove this message ) A simple Entity–Component–System layout. Entity component system ( ECS ) is a software architectural pattern. An ECS consists of entities composed of data components, along with systems that operate on those components. It is most associated with video game development for the representation of game world objects. ECS prioritizes composition over inheritance . Every entity is defined not by a type hierarchy, but by the components associated with it. Systems act globally over all entities that have the required components. For example, a food system might iterate through every entity with a relevant component tracking hunger, and act on them to push them a little away from satiation at time intervals. Entities lacking the component like terrain or items would be naturally ignored by the food system. Due to an ambiguity in the English language, an interpretation of the name is that an ECS is a system comprising entities and components. In the 2002 talk at GDC, [ 1 ] [ 2 ] Scott Bilas compared a C++ object system and his new custom component system. This is consistent with a traditional use of system terms in general systems engineering with Common Lisp Object System and type system as examples. Although mostly found in video game development , the ECS can be useful in other domains, [ 3 ] such as in robotics simulators like Gazebo. [ 4 ] [ example needed ] Characteristics [ edit ] ECS combines orthogonal, well-established ideas in general computer science and programming language theory . For example, components can be seen as a mixin idiom in various programming languages. Components are a specialized case under the general delegation approach and meta-object protocol . That is, any complete component object system can be expressed with the templates and empathy model within The Orlando Treaty [ 5 ] vision of object-oriented programming . Entity An entity represents a general-purpose object. In a game engine context, for example, every coarse game object is represented as an entity. Usually, it only consists of a unique ID. Implementations typically use a plain integer for this. [ 6 ] Component A component characterizes an entity as possessing a particular aspect, and (the component) holds the data needed to model that aspect. For example, every game object that can take damage might have a Health component associated with its entity. Implementations typically use structs , classes , or associative arrays . [ 6 ] System A system is a process that acts on all entities with the desired components. For example, a physics system may query for entities having mass, velocity and position components, iterate over the results, and do physics calculations for each entity using the set of components. The behavior of an entity can be changed at runtime by systems that add, remove or modify components. This eliminates the ambiguity problems of deep and wide inheritance hierarchies often found in object-oriented programming techniques that are difficult to understand, maintain, and extend. Common ECS approaches are highly compatible with, and are often combined with, data-oriented design techniques. Data for all instances of a component are contiguously stored together in physical memory, enabling efficient memory access for systems that operate over many entities. History [ edit ] In 1963, Ivan Sutherland 's Sketchpad stored the visual elements of a drawing using an early form of an ECS. Instead of encapsulating points in different objects (e.g. lines, circles, rectangles) points were stored in a ring buffer , and visual elements were only referencing them. When moving a point, this allowed updating all the shapes and constraints using it. [ 7 ] In 1998, Thief: The Dark Project pioneered an ECS. [ 8 ] The engine was later used for its sequel, as well as System Shock 2 . In 2002, Scott Bilas of Gas Powered Games ( Dungeon Siege ) gave a seminal talk on ECS. [ 1 ] This inspired numerous later well-known implementations. In early January 2007, Mick West who worked on the Tony Hawk series, shared his experiences on the process of ECS adoption at Neversoft. [ 9 ] Also in 2007, the team working on Operation Flashpoint: Dragon Rising experimented with ECS designs, including those inspired by Bilas/ Dungeon Siege , and Adam Martin later wrote a detailed account of ECS design, [ 10 ] including definitions of core terminology and concepts. [ 11 ] In particular, Martin's work popularized the ideas of systems as a first-class element, entities as identifiers, components as raw data, and code stored in systems, not in components or entities. In 2015, Apple Inc. introduced GameplayKit , an API framework for iOS , macOS and tvOS game development that includes an implementation of ECS. [ 12 ] In October 2018 [ 13 ] the company Unity released its megacity demo that utilized a tech stack built on an ECS. Unity's ECS runs on a powerful optimized architecture known as DOTS, which "empowers creators to scale processing in a highly performant manner". Variations [ edit ] The data layout of different ECS's can differ as well as the definition of components, how they relate to entities, and how systems access entities' components. Martin's ECS [ edit ] Adam Martin defines in his blog series what he considers an Entity–Component–System. [ 11 ] An entity only consists of an ID for accessing components. It is a common practice to use a unique ID for each entity. This is not a requirement, but it has several advantages: The entity can be referred using the ID instead of a pointer . This is more robust, as it would allow for the entity to be destroyed without leaving dangling pointers. It also helps for saving the state externally, when the state is loaded again, there is no need for pointers to be reconstructed. Data can be shuffled around in memory as needed, as long as the pointers are adjusted accordingly. Entity IDs can be used when communicating over a network to uniquely identify the entity. Some of these advantages can also be achieved using smart pointers . Components have no game code ( behavior ) inside of them. The components don't have to be located physically together with the entity, but should be easy to find and access using the entity. "Each System runs continuously (as though each System had its own private thread) and performs global actions on every Entity that possesses a Component or Components that match that System's query." The Unity game engine [ edit ] Unity 's layout has tables, each with columns of components. In this system an entity type is based on the components it holds. For every entity type there is a table (called an archetype ) holding columns of components that match the components used in the entity. To access a particular entity one must find the correct archetype (table) and index into each column to get each corresponding component for that entity. Common patterns in ECS use [ edit ] The normal way to transmit data between systems is to store the data in components, and then have each system access the component sequentially. For example, the position of an object can be updated regularly. This position is then used by other systems. If there are a lot of different infrequent events, a lot of flags will be needed in one or more components. Systems will then have to monitor these flags every iteration, which can become inefficient. A solution could be to use the observer pattern . All systems that depend on an event subscribe to it. The action from the event will thus only be executed once, when it happens, and no polling is needed. The ECS has no trouble with dependency problems commonly found in object-oriented programming since components are simple data buckets and have no dependencies. Each system will typically query the set of components an entity must have for the system to operate on it. For example, a render system might register the model, transformations, and drawable components. When it runs, the system will perform its logic on any entity that has all of those components. Other entities are simply skipped, with no need for complex dependency trees. However, this can be a place for bugs to hide, since propagating values from one system to another through components may be hard to debug. ECS may be used where uncoupled data needs to be bound to a given lifetime. The ECS uses composition, rather than inheritance trees . An entity will be typically made up of an ID and a list of components that are attached to it. Any game object can be created by adding the correct components to an entity. This allows the developer to easily add features to an entity, without any dependency issues. For example, a player entity could have a bullet component added to it, which would then meet the requirements to be manipulated by some bulletHandler system, which then could result in that bullet doing damage to other objects by running into them. The merits of using ECS for storing the game state have been proclaimed by many game developers like Adam Martin. One good example is the blog posts by Richard Lord, where he discusses the merits and why ECS-designed game data storage systems are so useful. [ 14 ] See also [ edit ] Model–view–controller Observer pattern Strategy pattern Relational model Notes [ edit ] References [ edit ] ^ a b Bilas, Scott. "A Data-Driven Game Object System" (PDF) . Archived (PDF) from the original on 18 September 2013 . Retrieved 25 December 2013 . ^ Bilas, Scott. "A Data-Driven Game Object System Audio" . Archived from the original on 18 April 2025 . Retrieved 18 April 2025 . ^ Romeo, Vittorio. (2016): Analysis of entity encoding techniques, design and implementation of a multithreaded compile-time Entity-Component-System C++14 library 10.13140/RG.2.1.1307.4165. ( https://www.researchgate.net/publication/305730566_Analysis_of_entity_encoding_techniques_design_and_implementation_of_a_multithreaded_compile-time_Entity-Component-System_C14_library ) ^ Open Robotics. "Gazebo Sim API Reference: Tutorials: Terminology" . Retrieved 10 September 2025 . ^ Lynn Andrea Stein, Henry Liberman, David Ungar: A shared view of sharing: The Treaty of Orlando . In: Won Kim, Frederick H. Lochovsky (Eds.): Object-Oriented Concepts, Databases, and Applications ACM Press, New York 1989, ch. 3, pp. 31–48 ISBN   0-201-14410-7 ( online Archived 2016-10-07 at the Wayback Machine ) ^ a b "Entity Systems Wiki" . Archived from the original on 31 December 2019 . Retrieved 31 December 2019 . ^ Sutherland, Ivan Edward (January 1963). "Sketchpad: A man-machine graphical communication system (courtesy Computer Laboratory, University of Cambridge UCAM-CL-TR-574 September 2003)" . Massachusetts Institute of Technology . Retrieved 2006-12-26 . ^ "The Unknown Design Pattern" . 11 March 2021. ^ "Evolve Your Hierarchy" . 5 January 2007. ^ Martin, Adam. "Entity Systems are the Future of MMOG Development" . Archived from the original on 26 December 2013 . Retrieved 25 December 2013 . ^ a b Martin, Adam. "Entity Systems are the Future of MMOG Development Part 2" . Archived from the original on 26 December 2013 . Retrieved 25 December 2013 . ^ "Introducing GameplayKit - WWDC 2015 - Videos" . Archived from the original on 2017-10-06 . Retrieved 2017-10-06 . ^ "Unity unleashes Megacity demo - millions of objects in a huge cyberpunk world" . MCV/DEVELOP . 2018-10-24 . Retrieved 2021-06-24 . ^ "Why use an Entity Component System architecture for game development?" . www.richardlord.net . Retrieved 2021-11-18 . External links [ edit ] Anatomy of a knockout Evolve Your Hierarchy Entity Systems Wiki Component - Game Programming Patterns ECS design to achieve true Inversion of Flow Control v t e Software design patterns Gang of Four patterns Creational Abstract factory Builder Factory method Prototype Singleton Structural Adapter Bridge Composite Decorator Facade Flyweight Proxy Behavioral Chain of responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template method Visitor Concurrency patterns Active object Balking Binding properties Double-checked locking Event-based asynchronous Guarded suspension Join Lock Monitor Proactor Reactor Read–write lock Scheduler Scheduled-task pattern Semaphore Thread pool Thread-local storage Architectural patterns Front controller Interceptor MVC MVP MVVM ADR ECS n -tier Specification Publish–subscribe Naked objects Service locator Active record Identity map Data access object (DAO) Data transfer object (DTO) Inversion of control Model 2 Broker Other patterns Blackboard Business delegate Composite entity Composition over inheritance Dependency injection Guard clause Intercepting filter Lazy loading Mock object Null object Object pool Servant Twin Type tunnel Method chaining Delegation Books Design Patterns Enterprise Integration Patterns People Christopher Alexander Erich Gamma Ralph Johnson John Vlissides Grady Booch Kent Beck Ward Cunningham Martin Fowler Robert Martin Jim Coplien Douglas Schmidt Linda Rising Communities The Hillside Group Portland Pattern Repository See also Anti-pattern Architectural pattern Retrieved from " https://en.wikipedia.org/w/index.php?title=Entity_component_system&oldid=1361949602 " Categories : Architectural pattern (computer science) Software design patterns Hidden categories: Webarchive template wayback links Articles with short description Short description is different from Wikidata Wikipedia articles with style issues from October 2013 All articles with style issues All articles needing examples Articles needing examples from February 2024 This page was last edited on 1 July 2026, at 01:05  (UTC) . Text is available under the Creative Commons Attribution-ShareAlike 4.0 License ; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy . Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc. , a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Legal & safety contacts Code of Conduct Developers Statistics Cookie statement Mobile view Search Search Toggle the table of contents Entity component system 7 languages Add topic