Post on 06-Apr-2016
transcript
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_;};
FLYWEIGHT
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
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];};
FLYWEIGHT
FLYWEIGHT
FLYWEIGHT Anstatt ein Netz aus enums besser ein Netz aus Zeigern:
class World{private: Terrain* tiles_[WIDTH][HEIGHT]; // Other stuff...};
FLYWEIGHT Direkt in der Welt speichern:
FLYWEIGHT
FLYWEIGHTconst Terrain& World::getTile(int x, int y) const{ return *tiles_[x][y];}
int cost = world.getTile(2, 3).getMovementCost();
FLYWEIGHT Vergleich von Zeiger zum enum: „indirect lookup“ Durch längeren Weg kann es cache misses geben Wichtig: vorher profilieren! Ist Flyweight das Richtige?
OBSERVER Model-View-Controller:
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
OBSERVER
OBSERVERDer Observer:
OBSERVERDas Subject:
Das Subject hat eine Liste mit Observern, nicht nur einen einzelnen
OBSERVERAufgabe des Subjects: Benachrichtigungen senden
OBSERVER
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
OBSERVER
OBSERVERBenachrichtigungen senden:
OBSERVER Jetzt können Observer aber nur ein Subject haben Lösung: selbstständige Knotenobjekte die auf die Observer zeigen
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
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
VIELEN DANK FÜR EURE AUFMERKSAMKEIT!