GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2...

26
GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz

Transcript of GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2...

Page 1: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

GAME PROGRAMMING PATTERNS –

FLYWEIGHT & OBSERVER Robert Nystrom

Softwaretechnologie II Teil 2 Anike Schulz

Page 2: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHTclass Tree {private: Mesh mesh_; Texture bark_; Texture leaves_; Vector position_; double height_; double thickness_; Color barkTint_; Color leafTint_;};

Page 3: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHT

Page 4: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHTclass TreeModel{private: Mesh mesh_; Texture bark_; Texture leaves_;};

class Tree{private: TreeModel* model_; Vector position_; double height_; double thickness_; Color barkTint_; Color leafTint_;};

Extrinsic state

Intrinsic state

Page 5: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHT Wird benötigt wenn viele Objekte „leichter“ gemacht werden müssen

Fliesenhaftes Terrain:enum Terrain{ TERRAIN_GRASS, TERRAIN_HILL, TERRAIN_RIVER // Other terrains...};

class World{private: Terrain tiles_[WIDTH][HEIGHT];};

Page 6: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHT

Page 7: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHT

Page 8: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHT Anstatt ein Netz aus enums besser ein Netz aus Zeigern:

class World{private: Terrain* tiles_[WIDTH][HEIGHT]; // Other stuff...};

Page 9: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHT Direkt in der Welt speichern:

Page 10: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHT

Page 11: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHTconst Terrain& World::getTile(int x, int y) const{ return *tiles_[x][y];}

int cost = world.getTile(2, 3).getMovementCost();

Page 12: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

FLYWEIGHT Vergleich von Zeiger zum enum: „indirect lookup“ Durch längeren Weg kann es cache misses geben Wichtig: vorher profilieren! Ist Flyweight das Richtige?

Page 13: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVER Model-View-Controller:

Page 14: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVER Spielbeispiel: Achievement System Ziel: Achievements durch unterschiedliche Sachen ausführen lassen aber zentral an einer Stelle im Code haben

Observer: Teilt mit, dass etwas passiert, es ist aber egal an wen die Nachricht geht

Page 15: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVER

Page 16: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVERDer Observer:

Page 17: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVERDas Subject:

Das Subject hat eine Liste mit Observern, nicht nur einen einzelnen

Page 18: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVERAufgabe des Subjects: Benachrichtigungen senden

Page 19: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVER

Page 20: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVER Häufige Kritiken am Observer: Er ist zu langsam Er ist zu schnell Es gibt zuviele dynamische Zuteilungen=> dafür gibt es Lösungen

Page 21: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVER

Page 22: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVERBenachrichtigungen senden:

Page 23: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVER Jetzt können Observer aber nur ein Subject haben Lösung: selbstständige Knotenobjekte die auf die Observer zeigen

Page 24: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVER Zwei Probleme: 1. Was passiert wenn man einen Observer/ ein Subject löscht?

Lösung: Selbstverwaltende Observer Lösung: Subject schickt Benachrichtigung vor dem Löschen

2. Wie finde ich einfach Fehler im Code? Lösung: Observer sind unpassend für das Spiel

Page 25: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

OBSERVER Observer heute:Nicht gut angesehen, starr und schwer, zu viele Klassen

Moderne Anwendung: Referenz zu Methode/ Funktion

Die Zukunft der Observer:Viele Versuche das immer gleiche Verhalten der Observer zu verbessern

Page 26: GAME PROGRAMMING PATTERNS – FLYWEIGHT & OBSERVER Robert Nystrom Softwaretechnologie II Teil 2 Anike Schulz.

VIELEN DANK FÜR EURE AUFMERKSAMKEIT!