C++ Tutorial: Timer 1



Ähnliche Dokumente
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Mehr Geld verdienen! Lesen Sie... Peter von Karst. Ihre Leseprobe. der schlüssel zum leben. So gehen Sie konkret vor!

Zwischenablage (Bilder, Texte,...)

DAS PARETO PRINZIP DER SCHLÜSSEL ZUM ERFOLG

Primzahlen und RSA-Verschlüsselung

Anleitung über den Umgang mit Schildern

Modellbildungssysteme: Pädagogische und didaktische Ziele

Nicht kopieren. Der neue Report von: Stefan Ploberger. 1. Ausgabe 2003

MARCANT - File Delivery System

Statuten in leichter Sprache

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Sie wollen gründen oder sich selbständig machen!

Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl

Wie halte ich Ordnung auf meiner Festplatte?

Sparen in Deutschland - mit Blick über die Ländergrenzen

Geld Verdienen im Internet leicht gemacht

Reizdarmsyndrom lindern

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

1. Standortbestimmung

Informationsblatt Induktionsbeweis

Alle Schlüssel-Karten (blaue Rückseite) werden den Schlüssel-Farben nach sortiert und in vier getrennte Stapel mit der Bildseite nach oben gelegt.

Begrüßung mit Schwung und Begeisterung. Die Teilnehmer müssen spüren, dass die Aufgabe Spaß macht.

Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken?

Gruppenrichtlinien und Softwareverteilung

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Produktionsplanung und steuerung (SS 2011)

ONLINE-AKADEMIE. "Diplomierter NLP Anwender für Schule und Unterricht" Ziele

Externe Abfrage von für Benutzer der HSA über Mozilla-Thunderbird

Wir machen neue Politik für Baden-Württemberg

Objektorientierte Programmierung

teamsync Kurzanleitung

Platinen mit dem HP CLJ 1600 direkt bedrucken ohne Tonertransferverfahren

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

TYPO3 Tipps und Tricks

1. Was ihr in dieser Anleitung

Repetitionsaufgaben Wurzelgleichungen

Software- und Druckerzuweisung Selbstlernmaterialien

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

- mit denen Sie Ihren Konfliktgegner in einen Lösungspartner verwandeln

ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Eschenweg Weiterstadt

MASTER-BERATUNG. im Fach Kunstgeschichte

So funktioniert das online-bestellsystem GIMA-direkt

Graphic Coding. Klausur. 9. Februar Kurs A

Anlage eines neuen Geschäftsjahres in der Office Line

Drucken aus der Anwendung

Menü auf zwei Module verteilt (Joomla 3.4.0)

Avenue Oldtimer Liebhaber- und Sammlerfahrzeuge. Ihre Leidenschaft, gut versichert

Drucken von Webseiten Eine Anleitung, Version 1.0

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Professionelle Seminare im Bereich MS-Office

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: )

2) Geben Sie in der Anmeldemaske Ihren Zugangsnamen und Ihr Passwort ein

Mind Mapping am PC. für Präsentationen, Vorträge, Selbstmanagement. von Isolde Kommer, Helmut Reinke. 1. Auflage. Hanser München 1999

Qualität und Verlässlichkeit Das verstehen die Deutschen unter Geschäftsmoral!

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

WinWerk. Prozess 6a Rabatt gemäss Vorjahresverbrauch. KMU Ratgeber AG. Inhaltsverzeichnis. Im Ifang Effretikon

Installationshinweise für OpenOffice Portable auf einem Wechseldatenträger Stand: 27. März 2003 LS Stuttgart, Kaufmännische ZPG

Kreativ visualisieren

Rohstoffanalyse - COT Daten - Gold, Fleischmärkte, Orangensaft, Crude Oil, US Zinsen, S&P500 - KW 07/2009

Erst Lesen dann Kaufen

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

6.2 Scan-Konvertierung (Scan Conversion)

Lernerfolge sichern - Ein wichtiger Beitrag zu mehr Motivation

Erwin Grüner

Feiertage in Marvin hinterlegen

Grundlagen der Theoretischen Informatik, SoSe 2008

Internationales Altkatholisches Laienforum

Übungen Programmieren 1 Felix Rohrer. Übungen

Alle gehören dazu. Vorwort

, dadurch wird der andere Modus eingestellt, also es sieht dann so aus

Simulation LIF5000. Abbildung 1

Java-Programmierung mit NetBeans

Anspruchsvolle Dreierausdrücke zum selbstständigen Lernen

Verschlüsselung mit PGP. Teil 1: Installation

BERECHNUNG DER FRIST ZUR STELLUNGNAHME DES BETRIEBSRATES BEI KÜNDIGUNG

1 Vom Problem zum Programm

Sparstudie 2014 Ergebnisse Burgenland: Gibt s noch Futter für das Sparschwein?

Handbuch ECDL 2003 Modul 2: Computermanagement und Dateiverwaltung Der Task-Manager

Studie Autorisierungsverfahren Online-Banking n = 433, Befragungszeitraum: Februar bis März 2014

So geht s Schritt-für-Schritt-Anleitung

Lineare Funktionen. 1 Proportionale Funktionen Definition Eigenschaften Steigungsdreieck 3

1 Einleitung. Lernziele. automatische Antworten bei Abwesenheit senden. Einstellungen für automatische Antworten Lerndauer. 4 Minuten.

Alice & More Anleitung. GigaMail.

Übungsaufgaben Tilgungsrechnung

Zählen von Objekten einer bestimmten Klasse

Chemie Zusammenfassung KA 2

Krawatten- und Schal-Konfigurator Gestalten Sie Ihre eigene Krawatte, Ihren eigenen Schal!

DollarIndex? AUD/JPY, AUD/USD? CHF/JPY - EUR/CHF, EUR/GBP, EUR/JPY, EUR/USD -

WinVetpro im Betriebsmodus Laptop

2.1 Präsentieren wozu eigentlich?

Es gibt nur eine Bilanz die zählt: Ihre Zufriedenheit.

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

Zeit lässt sich nicht wie Geld für schlechte Zeiten zur Seite legen. Die Zeit vergeht egal, ob genutzt oder ungenutzt.

Welche Gedanken wir uns für die Erstellung einer Präsentation machen, sollen Ihnen die folgende Folien zeigen.

Call: DT09FS ab

Mehr Arbeits-Plätze für Menschen mit Behinderung auf dem 1. Arbeits-Markt

Vorderthal, 15. April Liebe Eltern,

Handbuch zu SoSci Survey an der OVGU

Transkript:

C++ Tutorial: Timer 1 Timer v1.0 Einleitung Raum und Zeit sind spätestens seit der kopernikanischen Wende wichtige Gegenstände des Denkens geworden. In einem Programm bestimmt die Zeit die Abläufe und schlussendlich das Erscheinungsbild und spielt besonders in 3D Anwendungen eine extrem wichtige Rolle. Wir wollen uns also eine Art Hilfsbibliothek basteln, die uns alle wichtigen Funktionen rund um die Zeit zur Verfügung stellen soll. Plan / Features Als erstes wollen wir uns überlegen, was wir von einem Timer erwarten. Der Plan wird aufgrund des Umfangs dieses Tutorials entsprechend kurz. Aber warum nicht mal nur Stichworte? - Zeit einstellen / abrufen - Systemzeit (also die unter Windows!) holen - einen Zähler starten - pausieren (z.b. im Pausemenü eines Spiels soll die Zeit ja nicht weiterlaufen!) - vergangene Zeit seit dem letzten Frame abfragen (später dann sehr wichtig für die Transformation der Objekte in Abhängigkeit von der Zeit) - Anzahl Bilder pro Sekunde abfragen - skalieren der Zeit mit einem frei wählbaren Faktor (Bullet-time lässt grüssen!) Hmm... klingt im Moment vielleicht nach viel Arbeit, aber in Wirklichkeit gibt es gar nicht so viel zu tun ;-). Vergangene Zeit vs. Framebremse Im Kern eines jeden 3D Programms sitzt die so genannte Hauptschleife, welche x-mal pro Sekunde durchlaufen wird. Das Ziel ist es ja, eine möglichst hohe Framerate (wie oft das Bild in der Sekunde neu aufgebaut wird, also Anzahl frames per second) zu erreichen. Nun stellen wir uns folgendes vor: Wenn wir das Spiel in jedem Frame um eine Einheit fortbewegen, dann wäre die Bewegung abhängig von der Framerate und somit auch von der Hardware. Das Spiel würde also auf verschiedenen Systemen unterschiedlich schnell laufen, was besonders beim Spielen übers Netzwerk unfair ist. Der mit der ältesten Hardware wundert sich dann, weshalb er immer verliert. Tatsächlich haben sich Entwickler der ersten 3D Anwendungen noch keine Gedanken darüber gemacht und ihre Anwendungen sozusagen dem Rechentakt des Prozessors angepasst. Es gibt verschiedene Ansätze, dieses Problem zu lösen. Der erste (allerdings etwas unökonomische) Ansatz wäre der Einbau einer so genannten Framebremse. Am Ende jedes Hauptschleifendurchgangs wird eine weitere Schleife gestartet, die solange durchlaufen wird (resp. das Programm so lange pausieren lässt), bis exakt 40 Millisekunden seit dem Start des letzten Hauptschleifendurchgangs vergangen sind (1s / 0.04s = 25

C++ Tutorial: Timer 2 fps). Ein wesentlich besserer Ansatz ist das Fortbewegen des Spiels in Abhängigkeit der Zeit, d.h. die vergangene Zeit seit dem letzten Frame wird zum Faktor: Geschwindigkeit [m/s] = Fortbewegungseinheit [m] * vergangene_zeit [s] Bei schneller Hardware ist die vergangene Zeit kleiner und somit wird auch die Geschwindigkeit der Spielfigur verringert. Ergebnis: Gleichberechtigung :-). Implementierung Der folgende Source-Code ist, denke ich mal, genügend kommentiert, sodass ich mir weiteres Gelaber sparen kann ;-). kctimer::kctimer() // zurücksetzen ZeroMemory(this, sizeof(kctimer)); // Variablen auf 'sinnvolle' Startwerte setzen m_dwminute = 0; m_dwhour = 0; m_ffactor = 1.0f; m_fcounterstart = 0.0f; m_fcounterend = 0.0f; m_fcounterfactor = 0.001f; m_dwcounterstarttime = timegettime(); m_fclock = 0.0f; m_llcurtime = 0; m_lllasttime = 0; m_felapsedtime = 1.0f; m_flastelapsedtime = 1.0f; m_fstamp = 0.0f; m_ftime = 0.0f; m_dwfpsupdateinterval = 1000; m_bdelay = FALSE; // Wenn QueryPerformanceFrequency fehlschlägt, dann die etwas // 'ungenauere' Funktion timegettime() nehmen LONGLONG m_llperffreq; if (QueryPerformanceFrequency((LARGE_INTEGER *) &m_llperffreq)) QueryPerformanceCounter((LARGE_INTEGER *) &m_lllasttime); m_bperfflag = TRUE; else m_ftimescale = 1.0f / m_llperffreq; m_bperfflag = FALSE; m_lllasttime = timegettime(); m_ftimescale = 0.001f; // Zeit einstellen void kctimer::settime(int ihours, int iminutes, float ffactor) if (ihours > 23) ihours = 0; if (iminutes > 59)

C++ Tutorial: Timer 3 iminutes = 0; m_dwhour = ihours; m_dwminute = iminutes; // Zähler einstellen (imillis ist die gesamte Zählzeit in ms) void kctimer::setcounter(int istartcount, int iendcount, int imillis) // muss float sein, sonst ist m_ffactor ungültig // ist aber besser int zu übergeben - benutzerfreundlich ;-) m_fcounterstart = (float)istartcount; m_fcounterend = (float)iendcount; float fmillis = (float)imillis; m_fcounterfactor = ((m_fcounterend - m_fcounterstart) / fmillis); m_dwcounterstarttime = timegettime(); // Counterstand holen: wenn Counterstand gleich bleibt, ist das Zählen fertig int kctimer::getcounter() // Datenverlust beabsichtigt! Wir wollen nur ganze Zahlen int icount = (int)(m_fcounterstart + ((timegettime() - m_dwcounterstarttime) * m_fcounterfactor)); if (icount == m_fcounterend) // Werte so setzen, dass Formel oben immer m_fendcount gibt m_fcounterstart = m_fcounterend; m_fcounterfactor = 0.0f; return icount; // Daten updaten (vergangene Zeit ermitteln,...) void kctimer::update() if (m_bperfflag) QueryPerformanceCounter((LARGE_INTEGER *) &m_llcurtime); else m_llcurtime = timegettime(); // soll überhaupt geupdatet werden? if (!m_bdelay) // Vergangene Zeit in Millisekunden berechnen m_felapsedtime = (m_llcurtime - m_lllasttime) * m_ftimescale; m_lllasttime = m_llcurtime; // FramesPerSecond Counter (nur updaten wenn eine gewisse // Anzahl Millisekunden vergangen ist) if ((timegettime() - m_dwstarttime) > m_dwfpsupdateinterval) // Elapsed Time holen und Startzeit neu setzen m_flastelapsedtime = m_felapsedtime; // Uhr neu einstellen m_fclock += (m_felapsedtime * m_ffactor); if (m_fclock >= 1.0f)

C++ Tutorial: Timer 4 m_dwsecond++; m_fclock = 0.0f; if (m_dwsecond >= 60) m_dwminute++; if (m_dwminute >= 60) m_dwhour++; m_dwminute = 0; if (m_dwhour >= 24) m_dwhour = 0; else // TimeStamp einstellen m_fstamp = 0.0f; m_fstamp += m_fclock; m_fstamp += m_dwsecond; m_fstamp += m_dwminute * 100; // 3 Dezimalstellen nach links m_fstamp += m_dwhour * 10000; // 4 Dezimalstellen nach links m_lllasttime = m_llcurtime; m_ftime += m_felapsedtime; // Macht eine Pause void kctimer::wait(int imilliseconds) while (timegettime() < (m_dwstarttime + imilliseconds)) // nichts tun :-) // Liefert die aktuelle Systemzeit SYSTEMTIME kctimer::getsystime(char* pcsystime) // die aktuelle Systemzeit abfragen GetLocalTime(&m_SysTime); Natürlich ist dieser Code noch nicht optimiert und sollte noch um einige Funktionen erweitert werden. Doch für den Anfang dürfte es genug Futter sein, der Rest ist Hausaufgabe.

C++ Tutorial: Timer 5 Quellen - Zerbst, Stefan (2002). 3D Spieleprogrammierung mit DirectX in C++ - Band II. Braunschweig: Books on Demand GmbH Copyright 2005 by Reto Da Forno Irrtümer vorbehalten - Fehler bitte melden! 18.10.05 http://www.keepcoding-development.ch.vu