Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung.

Ähnliche Präsentationen


Präsentation zum Thema: "Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung."—  Präsentation transkript:

1 Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung

2 Look-Up Tabellen: Probleme bei Spielen Spielszenen müssen sehr oft pro Sekunden berechnet werden Spielszenen müssen sehr oft pro Sekunden berechnet werden Wenn es zu viele Berechnungen werden fängt das Spiel an zu ruckeln Wenn es zu viele Berechnungen werden fängt das Spiel an zu ruckeln Problem ist nicht immer die Grafikkarte (bei 3D spielen) Problem ist nicht immer die Grafikkarte (bei 3D spielen) Häufig ist KI schuld (z.B. bei Strategiespielen: viele Einheiten werden von Computer bewegt und kommandiert) Häufig ist KI schuld (z.B. bei Strategiespielen: viele Einheiten werden von Computer bewegt und kommandiert) wiederkehrende Operationen werden immer neu berechnet

3 Lösung: Look Up Tabelle Wikipedia: Wikipedia: In der Informatik ist eine Look-Up-Table eine Datenstruktur, meist ein (assoziatives) Array, das komplizierte Laufzeitberechnungen durch einen einfachen Zugriff auf die Datenstruktur ersetzt. Dies führt zu einem signifikanten Geschwindigkeitsgewinn, sofern die benötigten Speicherzugriffe schneller sind als die normale Berechnung. In der Informatik ist eine Look-Up-Table eine Datenstruktur, meist ein (assoziatives) Array, das komplizierte Laufzeitberechnungen durch einen einfachen Zugriff auf die Datenstruktur ersetzt. Dies führt zu einem signifikanten Geschwindigkeitsgewinn, sofern die benötigten Speicherzugriffe schneller sind als die normale Berechnung.Informatik DatenstrukturassoziativesArrayInformatik DatenstrukturassoziativesArray Alle wiederkehrenden Berechnungen werden durch Look-Up Tabellen vermieden Alle wiederkehrenden Berechnungen werden durch Look-Up Tabellen vermieden

4 Was macht eine Look-Up Tabelle? Vor Beginn des Spiels werden alle benötigten Werte vorberechnet Vor Beginn des Spiels werden alle benötigten Werte vorberechnet Es gibt verschiedene Typen von Look-Up Tabellen, so dass man sich vorher überlegen muss, von welcher Art (sin, cos, Quadratwurzel) diese sein muss und welche Genauigkeit diese haben muss Es gibt verschiedene Typen von Look-Up Tabellen, so dass man sich vorher überlegen muss, von welcher Art (sin, cos, Quadratwurzel) diese sein muss und welche Genauigkeit diese haben muss Es können nicht nur Funktionswerte, sondern bsplw. auch Zufallszahlen in Look-Up Tabellen gespeichert werden Es können nicht nur Funktionswerte, sondern bsplw. auch Zufallszahlen in Look-Up Tabellen gespeichert werden Um flexibel mit Look Up Tabellen arbeiten zu können sollte man sie in Klassen einbetten Um flexibel mit Look Up Tabellen arbeiten zu können sollte man sie in Klassen einbetten

5 Beispiel: #include #include #define SAFE_DELETE(p) {if(p) {delete (p); (p)=NULL;}} #define SAFE_DELETE(p) {if(p) {delete (p); (p)=NULL;}} #define SAFE_DELETE_ARRAY(p) {if(p) {delete[] (p); (p)=NULL;}} #define SAFE_DELETE_ARRAY(p) {if(p) {delete[] (p); (p)=NULL;}} // bis hier hin nur Vorgeplänkel, Includen von iostream und math-Klasse und Einbinden von Makros von Heap-Speicher // bis hier hin nur Vorgeplänkel, Includen von iostream und math-Klasse und Einbinden von Makros von Heap-Speicher //Beispiel: sinus-Tabelle //Beispiel: sinus-Tabelle

6 class CSinLookUp class CSinLookUp { private: private: long AnzElements; long AnzElements; float Genauigkeit; float Genauigkeit; float* Tabelle; float* Tabelle;

7 public: public: CSinLookUp(float Schrittweite = 1.0f) // Konstruktor CSinLookUp(float Schrittweite = 1.0f) // Konstruktor { { Genauigkeit = 1.0f/Schrittweite; Genauigkeit = 1.0f/Schrittweite; AnzElements = (long)(360*Genauigkeit); AnzElements = (long)(360*Genauigkeit); Tabelle = new float[AnzElements]; Tabelle = new float[AnzElements]; for(long winkel = 0; winkel < AnzElements; winkel++) for(long winkel = 0; winkel < AnzElements; winkel++) { { // Berechnung der Sinus Look-Up Tabelle // Berechnung der Sinus Look-Up Tabelle Tabelle[winkel] = sinf(winkel*Schrittweite* f/180.0f); Tabelle[winkel] = sinf(winkel*Schrittweite* f/180.0f); } } ~CSinLookUp() // Destruktor ~CSinLookUp() // Destruktor { { SAFE_DELETE_ARRAY(Tabelle) // Zerstören des Arrays SAFE_DELETE_ARRAY(Tabelle) // Zerstören des Arrays } } float ReturnSinValue(float winkel) // Zugriffsfunktion float ReturnSinValue(float winkel) // Zugriffsfunktion { { if(winkel < 0.0f) if(winkel < 0.0f) winkel += 360.0f; winkel += 360.0f; else if(winkel > 360.0f) else if(winkel > 360.0f) winkel -= 360.0f; winkel -= 360.0f; return(Tabelle[(long)(winkel*Genauigkeit)]); return(Tabelle[(long)(winkel*Genauigkeit)]); } } }; };

8 Aufruf in Methode mit: CSinLookUp* SinLookUp = new CSinLookUp(0.1f); // Schrittweite //von 0.1 CSinLookUp* SinLookUp = new CSinLookUp(0.1f); // Schrittweite //von 0.1 cout ReturnSinValue(45.0f) ReturnSinValue(45.0f) << endl; SAFE_DELETE(SinLookUp) // zerstören der Tabelle SAFE_DELETE(SinLookUp) // zerstören der Tabelle

9 Zufallszahlen Werden in einem Spiel hauptsächlich für die Variation des Spielablaufes und des Gegnerverhaltens eingesetzt Werden in einem Spiel hauptsächlich für die Variation des Spielablaufes und des Gegnerverhaltens eingesetzt In C++ gibt es eine Funktion für Zufallszahlen In C++ gibt es eine Funktion für Zufallszahlen rand()-Funktion ist komfortabel für die Erzeugung von Zufallszahlen rand()-Funktion ist komfortabel für die Erzeugung von Zufallszahlen Am komfortabelsten ist es, eine Klasse alleine für Zufallszahlen anzulegen und die Zahlen in einer Tabelle zu speichern Am komfortabelsten ist es, eine Klasse alleine für Zufallszahlen anzulegen und die Zahlen in einer Tabelle zu speichern

10 Aufruf der Zufallszahlenmethode und Initialisierung des Zufallsgenerators int main(void) int main(void) { // Initialisierung des Zufallsgenerators // Initialisierung des Zufallsgenerators srand(time(0)); srand(time(0)); // dann Aufruf der Zufallszahlenfunktion // dann Aufruf der Zufallszahlenfunktion cout << frnd(-5.0f,5.0f) << endl; cout << frnd(-5.0f,5.0f) << endl; }

11 Erzeugung von Zufallszahlen mit rand()-Funktionen Mit einfachen Inline-Funktion (hier float-Zufallszahl): Mit einfachen Inline-Funktion (hier float-Zufallszahl): float tempFrnd; float tempFrnd; inline float frnd(float low, float high) inline float frnd(float low, float high) { tempFrnd = low + ( high - low ) * ( (long)rand() ) / RAND_MAX; tempFrnd = low + ( high - low ) * ( (long)rand() ) / RAND_MAX; // RAND_MAX enthält die größtmögliche Zufallszahl // RAND_MAX enthält die größtmögliche Zufallszahl if(tempFrnd < high) if(tempFrnd < high) return tempFrnd; return tempFrnd; else else return low; return low; } // weiteres Beispiel im Buch (extra Klasse für Zufallszahlen) // weiteres Beispiel im Buch (extra Klasse für Zufallszahlen)

12 Einfach verkettete Listen Einheit zur Speicherung und Verwaltung relevanter Daten Einheit zur Speicherung und Verwaltung relevanter Daten Besteht aus mehreren Knoten (sofern mehrere Daten vorhanden sind) Besteht aus mehreren Knoten (sofern mehrere Daten vorhanden sind) Jeder Knoten ist über einen Zeiger mit dem nächsten Knoten verbunden Jeder Knoten ist über einen Zeiger mit dem nächsten Knoten verbunden Jeder Knoten ist entweder eine Strukturvariable oder ein Klassenobjekt Jeder Knoten ist entweder eine Strukturvariable oder ein Klassenobjekt Erster Knoten = Head-Knoten Erster Knoten = Head-Knoten Letzter Knoten = Tail-Knoten Letzter Knoten = Tail-Knoten

13 Wie sieht eine einfach verkettete Liste aus? Head Node Node Node Tail Head Node Node Node Tail

14 Probleme Probleme bei Listen Probleme bei Listen Sehr unflexibel Sehr unflexibel Sehr langsam Sehr langsam Will man auf ein Element zugreifen, muss die gesamte Liste durchlaufen werden um das Element zu finden (es sei denn es befindet sich am Anfang) Will man auf ein Element zugreifen, muss die gesamte Liste durchlaufen werden um das Element zu finden (es sei denn es befindet sich am Anfang) Die Reihenfolge der abgelegten Objekte entspricht meistens nicht der Reihenfolge der im Spiel benötigten Objekte Die Reihenfolge der abgelegten Objekte entspricht meistens nicht der Reihenfolge der im Spiel benötigten Objekte

15 Speicherprobleme Jedes Erzeugen von Knoten kostet Speicherplatz (mit new wird Speicherplatz reserviert) Jedes Erzeugen von Knoten kostet Speicherplatz (mit new wird Speicherplatz reserviert) new sucht nach einem Speicherblock mit geeigneter Größe new sucht nach einem Speicherblock mit geeigneter Größe Nur wenn ein geeigneter Block gefunden wird kann Objekt angelegt werden Nur wenn ein geeigneter Block gefunden wird kann Objekt angelegt werden Sind alle gefundenen Speicherblöcke zu klein, kann Objekt nicht erzeugt werden Sind alle gefundenen Speicherblöcke zu klein, kann Objekt nicht erzeugt werden Speicherfragmentierung

16 Arrays lösen diese Probleme Arrays reservieren einen bestimmten Speicherplatz Arrays reservieren einen bestimmten Speicherplatz Kritik: unnötiger Speicherplatz wird verschenkt und Arrays sind zu unflexibel Kritik: unnötiger Speicherplatz wird verschenkt und Arrays sind zu unflexibel Für Spieleprogrammierung gilt das nicht Für Spieleprogrammierung gilt das nicht Beispiel: Beispiel: Spiel mit animierten Asteroiden Spiel mit animierten Asteroiden Obergrenze der Anzahl an Asterioden wird durch vordefiniertes Array festgelegt Obergrenze der Anzahl an Asterioden wird durch vordefiniertes Array festgelegt Kein Nachteil, weil sowieso nur eine gewisse Anzahl gerendert und animiert werden können Kein Nachteil, weil sowieso nur eine gewisse Anzahl gerendert und animiert werden können Zugriff auf Array geht viel schneller als Zugriff auf Element in verketteter Liste Zugriff auf Array geht viel schneller als Zugriff auf Element in verketteter Liste

17 Memory Manager Es ist sinnvoll eine Klasse zu entwerfen die die Speicherverwaltung in einem Spiel übernimmt Es ist sinnvoll eine Klasse zu entwerfen die die Speicherverwaltung in einem Spiel übernimmt Also alles in einer Memory Manager Klasse Also alles in einer Memory Manager Klasse Klasse hat vordefiniertes Array mit dem gearbeitet werden kann Klasse hat vordefiniertes Array mit dem gearbeitet werden kann Beispiel im Buch Beispiel im Buch Programmbeispiele Tag2 Memory Manager Programmbeispiele Tag2 Memory Manager

18 Dateiverwaltung Dazu zählt etwa eine Speicherfunktion für ein Spiel Dazu zählt etwa eine Speicherfunktion für ein Spiel Wichtige Struktur in Beispiel: Wichtige Struktur in Beispiel: _finddata_t Speichert alle Informationen über die Dateiarbeit _finddata_t Speichert alle Informationen über die Dateiarbeit Wichtige Funktionen sind: Wichtige Funktionen sind: _findfirst( "Szenarien/*.*", &c_file ) _findfirst( "Szenarien/*.*", &c_file ) Untersucht ob der Ordner überhaupt existiert Untersucht ob der Ordner überhaupt existiert _findnext( hFile, &c_file ) _findnext( hFile, &c_file ) Alle weiteren Dateien werden durchsucht Alle weiteren Dateien werden durchsucht


Herunterladen ppt "Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung."

Ähnliche Präsentationen


Google-Anzeigen