Component-Based Entity Systems (Demo)

58
Game Programming Component-Based Entity Systems Nick Prühs

Transcript of Component-Based Entity Systems (Demo)

Page 1: Component-Based Entity Systems (Demo)

Game ProgrammingComponent-Based Entity Systems

Nick Prühs

Page 2: Component-Based Entity Systems (Demo)

About Me

“Best Bachelor“ Computer ScienceKiel University, 2009

Master GamesHAW Hamburg, 2011

Lead ProgrammerDaedalic Entertainment, 2011-2012

Co-Founderslash games, 2013

Microsoft MVP2015

2 / 79

Page 3: Component-Based Entity Systems (Demo)

Objectives

• To understand the disadvantages of inheritance-based game models

• To learn how to build an aggregation-based gamemodel

• To understand the advantages and disadvantages of aggregation-based game models

3 / 57

Page 4: Component-Based Entity Systems (Demo)

“Say you’re an engineer…

… set out to create a new Game Object System from scratch, and you’re going to ‘do it right the first time’. Youtalk to your designer and say ‘What kind of content are we going to have in this game?’

They respond with ‘Oh lots of stuff, trees, and birds, and bushes, and keys and locks and … <trailing off>’

And your eyes glaze over as you start thinking of fancy C++ ways to solve the problem.

The object oriented programming sages tell you to try to determine Is-A relationships and abstract functionalityand all that other fun stuff. You go to the book store and buy a C++ book just to be sure, and it tells you to fireup your $5000 UML editor. [...]”

- Scott Bilas

4 / 57

Page 5: Component-Based Entity Systems (Demo)

Entities

5 / 57

Page 6: Component-Based Entity Systems (Demo)

Entities

6 / 57

Page 7: Component-Based Entity Systems (Demo)

Entities

7 / 57

Page 8: Component-Based Entity Systems (Demo)

Entities

8 / 57

Page 9: Component-Based Entity Systems (Demo)

Entities

9 / 57

Page 10: Component-Based Entity Systems (Demo)

Entities

10 / 57

Page 11: Component-Based Entity Systems (Demo)

Entities

• object in your game world

• can (or cannot)…• be visible

• move around

• attack

• explode

• be targeted

• become selected

• follow a path

• common across all genres

11 / 57

Page 12: Component-Based Entity Systems (Demo)

Entities

12 / 57

Page 13: Component-Based Entity Systems (Demo)

Approach #1: Inheritance

13 / 57

Page 14: Component-Based Entity Systems (Demo)

Approach #1: Inheritance

• Entity base class

• that class and its subclasses encapsulate the main game logic

14 / 57

Page 15: Component-Based Entity Systems (Demo)

Example #1: Unreal Engine 3

• base class Actor• rendering

• animation

• sound

• physics

• almost everything in Unreal is an Actor• Pawn extends by taking damage

• Projectile extends by spawning impact effects

15 / 57

Page 16: Component-Based Entity Systems (Demo)

Drawbacks of inheritance-based game models

• Diamond of Death

16 / 57

Page 17: Component-Based Entity Systems (Demo)

Drawbacks of inheritance-based game models

• code added to the root of the inheritance tree causes big overhead

• code added to the leafs of the tree tends to get copied

• root and leaf classes tend to get very big

17 / 57

Page 18: Component-Based Entity Systems (Demo)

Where is Waldo?

public override void TakeDamage(int damage)

{

this.Health -= damage;

}

18 / 57

Page 19: Component-Based Entity Systems (Demo)

Where is Waldo?

public override void TakeDamage(int damage)

{

this.Health -= damage;

}

19 / 57

Page 20: Component-Based Entity Systems (Demo)

Where is Waldo?

public override void TakeDamage(int damage)

{

base.TakeDamage(damage);

this.Health -= damage;

}

20 / 57

Page 21: Component-Based Entity Systems (Demo)

Drawbacks of inheritance-based game models

• always need to understand all base classes along the inheritance tree

• impossible to enforce calling base class functions• Someone will forget it. Trust me.

• And you’re gonna spend your whole evening finding that one missing base.Update().

• deep class hierarchies will more likely run into call order issues

21 / 57

Page 22: Component-Based Entity Systems (Demo)

Inheritance-based game models are…

• … difficult to develop

• … difficult to maintain

• … difficult to extend

22 / 57

Page 23: Component-Based Entity Systems (Demo)

“There are probably hundreds of ways…

… you could decompose your systems and come up with a set ofclasses […], and eventually, all of them are wrong. This isn’t to saythat they won’t work, but games are constantly changing,constantly invalidating your carefully planned designs. [...]

So you hand off your new Game Object System and go work onother things.

Then one day your designer says that they want a new type of“alien” asteroid that acts just like a heat seeking missile, except it’sstill an asteroid.”

- Scott Bilas

23 / 57

Page 24: Component-Based Entity Systems (Demo)

“alien” asteroid

24 / 57

Page 25: Component-Based Entity Systems (Demo)

Approach #2: Aggregation

25 / 57

Page 26: Component-Based Entity Systems (Demo)

Approach #2: Aggregation

26 / 57

Page 27: Component-Based Entity Systems (Demo)

Approach #2: Aggregation

• popular since Gas Powered Games’ Dungeon Siege

• introduced long before

• entities are aggregations of components• which in turn encapsulate independent functionality

• corresponds to recommendations by the Gang of Four• “favor object composition over class inheritance”

• similar approach is used by the Unity3D game engine• just for clarification: Unreal uses components as well, called

ActorComponent

27 / 57

Page 28: Component-Based Entity Systems (Demo)

Approach #2a

• create an Entity class

• add references to all available components

• has obvious disadvantages:• many component references will be null pointers for

most entities

• big unnecessary memory overhead

• Entity class has to be updated each time a new component is introduced

28 / 57

Page 29: Component-Based Entity Systems (Demo)

Approach #2b

• create an Entity class

• introduce a common base class for components

• entities hold a collection of Component objects• reduced the memory overhead

• increased extensibility

• already gets close to an optimal solution• easy to build, maintain and debug

• easy to implement new design ideas without breaking existing code

29 / 57

Page 30: Component-Based Entity Systems (Demo)

However, we can do better.

30 / 57

Page 31: Component-Based Entity Systems (Demo)

Approach #2c: Entity Systems

31 / 57

Page 32: Component-Based Entity Systems (Demo)

Approach #2c: Entity Systems

32 / 57

Page 33: Component-Based Entity Systems (Demo)

Approach #2c: Entity Systems

• game entities are nothing more than just an id

• thus, no data or methods on entities

• no methods on components, either: all functionality goes into what is called a system• PhysicsSystem

• HealthSystem

• FightSystem

• entirely operate on their corresponding components

33 / 57

Page 34: Component-Based Entity Systems (Demo)

“All the data goes into the Components.

All of it. Think you can take some “really common”data, e. g. the x-/y-/z-coordinates of the in-gameobject, and put it into the Entity itself? Nope. Don’tgo there. As soon as you start migrating data into theEntity, you’ve lost. By definition the only valid placefor the data is inside the Component.”

- Adam Martin

34 / 57

Page 35: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

35 / 57

Page 36: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

36 / 57

Page 37: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

37 / 57

Page 38: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

38 / 57

Page 39: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

39 / 57

Page 40: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

40 / 57

Page 41: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

41 / 57

Page 42: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

42 / 57

Page 43: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

43 / 57

Page 44: Component-Based Entity Systems (Demo)

Example #2: Simple Fight

44 / 57

Page 45: Component-Based Entity Systems (Demo)

Inter-System Communication

Systems communicate by the means of events, only.

• no coupling between systems• easy to add or remove systems at any time

• great architectural advantage for general game features• need multiplayer? just send the events over the network!

• need AI? just make it create events which are handled just like player input is!

• need replays? just write all events with timestamps to a file!

45 / 57

Page 46: Component-Based Entity Systems (Demo)

Inter-System Communication

46 / 57

Page 47: Component-Based Entity Systems (Demo)

Advantages of Entity Systems

• update order is obvious

• components can easily be pooled and re-used

• independent systems can be updated by separate threads

• data can easily be serialized and stored in a database

47 / 57

Page 48: Component-Based Entity Systems (Demo)

uFrame ECS

48 / 12

Page 49: Component-Based Entity Systems (Demo)

uFrame ECS

DEMO

49 / 12

Page 50: Component-Based Entity Systems (Demo)

Assignment

1. Reduce Health of attacked entities.

2. Remove killed entities.

50 / 12

Page 51: Component-Based Entity Systems (Demo)

Assignment

1. Reduce Health of attacked entities.

2. Remove killed entities.

Hint

First, think about the components (data), systemsand events you might need!

51 / 12

Page 52: Component-Based Entity Systems (Demo)

Assignment

1. Reduce Health of attacked entities.1. Add an AttackComponent with a Damage property.

2. Add a HealthComponent with a Health property.

3. Add groups for attacker and defender entities.

4. Add a DamageSystem modifying these components.

2. Remove killed entities.

52 / 12

Page 53: Component-Based Entity Systems (Demo)

Assignment

1. Reduce Health of attacked entities.1. Add an AttackComponent with a Damage property.

2. Add a HealthComponent with a Health property.

3. Add groups for attacker and defender entities.

4. Add a DamageSystem modifying these components.

2. Remove killed entities.1. Add a HealthChanged event.

2. Raise the HealthChanged event in the appropriate system.

3. Add a DefeatSystem destroying defeated entities.

53 / 12

Page 54: Component-Based Entity Systems (Demo)

Assignment

3. Add a random value to the damage caused by each attack.

4. Reduce damage taken by an Armor value of the attacked entity.

5. Implement leveling up entities, increasing their current Health and Damage.

54 / 12

Page 55: Component-Based Entity Systems (Demo)

Assignment Solution

Publicly available at

https://github.com/npruehs/teaching-ecs-uframe

55 / 12

Page 56: Component-Based Entity Systems (Demo)

Takeaway

• inheritance-based game models show a lot of disadvantages

• entity systems are easy to maintain and debug• provide great extensibility without the necessity of

modifying existing code

• show better performance characteristics for both memory and CPU load

• easy to implement commonly used features• scripting

• serialization

• logging

56 / 57

Page 57: Component-Based Entity Systems (Demo)

References

• Mick West. Evolve Your Hierarchy. http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/, January 5, 2007.

• Levi Baker. Entity Systems Part 1: Entity and EntityManager.http://blog.chronoclast.com/2010/12/entity-systems-part-1-entity-and.html, December 24, 2010.

• Kyle Wilson. Game Object Structure: Inheritance vs. Aggregation.http://gamearchitect.net/Articles/GameObjects1.html, July 3, 2002.

• Adam Martin. Entity Systems are the future of MMOG development – Part 1. http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/, September 3, 2007.

• Adam Martin. Entity Systems: what makes good Components? good Entities? http://t-machine.org/index.php/2012/03/16/entity-systems-what-makes-good-components-good-entities/, March 16, 2012.

• Scott Bilas. A Data-Driven Game Object System.http://scottbilas.com/files/2002/gdc_san_jose/game_objects_slides_with_notes.pdf, Slides, GDC 2002.

• Scott Bilas. A Data-Driven Game Object System.http://scottbilas.com/files/2002/gdc_san_jose/game_objects_paper.pdf, Paper, GDC 2002.

• Insomniac Games. A Dynamic Component Architecture for High Performance Gameplay.http://www.insomniacgames.com/a-dynamic-component-architecture-for-high-performance-gameplay/, June 1, 2010.

57 / 57

Page 58: Component-Based Entity Systems (Demo)

Thank you!

http://www.npruehs.de

https://github.com/npruehs

@npruehs

[email protected]