ecs back and forth - github pages · michele caini ( skypjack ) ecs back and rthfo june 15,...

20

Upload: others

Post on 06-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

ECS Back and Forth

Michele Caini

skypjack

June 15, 2019

Released under CC BY-SA 4.0

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 1 / 17

Page 2: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 2 / 17

Page 3: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Introduction Entity-Component-System

From hierarchies to components

Entity�Component�System (ECS) is an architectural pattern.

It favors composition over inheritance and sacri�ces encapsulation.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 3 / 17

Page 4: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Introduction Entity-Component-System

Premise

Entity-Component-System (ECS)o�ers better code organization and higher performance

but

It is not the Holy Grail

of game development.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 4 / 17

Page 5: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth The Big Array

A Big Array to rule them all

Entity identi�ers are indexes, bitsets are component masks.

More holes, more jumps, more wasted memory, less performance.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 5 / 17

Page 6: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth The Big Array

Holes, holes everywhere

Iterate bitmasks, use entities to get components when needed.

Components are only apparently tightly packed, in fact they are not.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 6 / 17

Page 7: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth The Big Array

Pros and Cons

The big array is good enough for small games:

Straightforward to implement and to maintain.

Best performance on construction/destruction of components.

Pretty good performance when arrays of components are dense.

Too much memory is wasted in real world cases.

Holes defeat the purpose of keeping instances tightly packed.

We don't know what entities own what components.

It can be re�ned to match the requirements of medium (?) sized games.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 7 / 17

Page 8: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Archetypes

Archetypes (the easy version)

Entities are moved

between archetypes.

More combinationsmeans higherfragmentation.

Multithreading

friendly (withblock-basedarchetypes).

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 8 / 17

Page 9: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Archetypes

Fragmentation: yay or nay?

Components are onlytightly packed perarchetype.

Fragmentation

cannot be any wayworse than this.

Cache or searcharchetypes matchedwith queries.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 9 / 17

Page 10: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Archetypes

Pros and Cons

Well suited when performance matters:

Really good performance both on single and multiple components.

Multithreading is straightforward to achieve in some cases.

Best performance on bulk creation of entities and components.

Assigning and removing components is intrinsically slow.

Fragmentation can a�ect performance to an extent.

Some operations are not supported out-of-the-box (eg sorting).

It can be re�ned to increase even further bene�ts and performance.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 10 / 17

Page 11: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Sparse Set

They call me Packed Array

Lookup, insertion, deletion, . . . complexity is O(1).

Iteration is O(N) and the dense array is tightly packed.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 11 / 17

Page 12: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Sparse Set

They call me Packed Array

Lookup, insertion, deletion, . . . complexity is O(1).

Iteration is O(N) and the dense array is tightly packed.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 11 / 17

Page 13: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Sparse Set

They call me Packed Array

Lookup, insertion, deletion, . . . complexity is O(1).

Iteration is O(N) and the dense array is tightly packed.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 11 / 17

Page 14: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Sparse Set

They call me Packed Array

Lookup, insertion, deletion, . . . complexity is O(1).

Iteration is O(N) and the dense array is tightly packed.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 11 / 17

Page 15: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Sparse Set

A real world example: EnTT

A customized sparse set is used for the pools of components.

Multiple access patterns supported, from perfect SoA to fully random.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 12 / 17

Page 16: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Sparse Set

Pros and Cons

Well suited when performance matters:

Grouping functionalities can reach outstanding performance.

Best performance when it comes to iterating single components.

Multithreading friendly, not necessarily built-in.

Users must know what are their data to get the best.

Users must know what are their critical paths and what are not.

Indirection can a�ect performance to an extent in some cases.

It can be re�ned to reduce or even eliminate indirection in most cases.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 13 / 17

Page 17: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

Back and Forth Which, how, when, where

Are they in the same ballpark?

Know you game/software.

The big array plays in a di�erent (lower) league.Archetypes vs Sparse sets: 1M of elements, di�erences of 0.N ms.

Almost static vs dynamic entities.

Archetypes for low level systems (eg rendering).Sparse sets for high level systems (eg gameplay).Both are just �ne for going full-ECS.

Performance on construction/destruction matters.

Archetypes: many batch creations, few assignments/deletions.Sparse sets: components to the rescue (eg messaging system).

Interested in how things are laid out?

Archetypes o�er many small groups for known patterns.Sparse sets o�er always a (T∗, size) couple.

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 14 / 17

Page 18: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

ECS and C++ Shameless plug

The C++ of EnTT

EnTT is a C++ framework mainly known for its ECS model.

Some things you can spot here and there if you pay attention:

Type erasure: pools for components, signals, and so on.

SFINAE (Substitution Failure Is Not An Error): any �le of your choice.

CRTP (Curiously Recurring Template Pattern): emitter class.

Tag dispatching: process and scheduler classes.

Type traits: named types to make EnTT work across boundaries.

Small object optimization: meta_any class.

And much, much more. . .

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 15 / 17

Page 19: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

The time is (probably) over Questions?

Questions?

Italian C++ Conference 2019

June 15, Milan

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 16 / 17

Page 20: ECS Back and Forth - GitHub Pages · Michele Caini ( skypjack ) ECS Back and rthFo June 15, 201914/17. ECS and C++ Shameless plug The C++ of EnTT EnTT is a C++ framework mainly known

References Beyond the talk

Links

ECS back and forth series

IntroductionWhere are my entities?Sparse sets and grouping functionalitiesWhy you don't need to store deleted entitiesTo be continued. . .

EnTT - Gaming meets modern C++

EntityX - A fast, type-safe C++ Entity-Component system

decs - Prototype data-oriented ECS

Unity DOTS - Data-Oriented Technology Stack

Michele Caini (skypjack) ECS Back and Forth June 15, 2019 17 / 17