Welcome to the new Friends-of-FPC!

Here you can find all kinds of information about the FreePascal Compiler. We have many tutorials and howtos as well as a selection of tools to help you with your programming. We also have some example codes for you. And if you want to contribute some information/ sources/ tools yourself you can do so.
Also we have finally relaunched the FoFPC forum. It's your chance for some Q&A about everything FreePascal.

Friends-of-FPC

Tutorials: Learn how to code with FreePascal.

Source Codes: A collection of examples, miscellaneous source codes and open source stuff.

Tools and Help Files: Intro- duction of some tools that might help you with FPC.

Community

Forum: Ask or answer questions about the FreePascal Compiler, programming or just babble about coding.

Contribute! Contribute your own Tutorial, Source Codes or Tools and send them to us!

Website

About: Information about Friends-of-FPC.org.

Grundlagen der Grafikprogrammierung - Teil 17 - by Delax

Tach'!

Ich überarbeitete gerade den letzten Teil (Partikel), da fiel es mir auf, das wir einen netten kleinen Helfer noch gar nicht hatten: GetTickCount(). Ich hatte ihn zwar zu Debug Zwecken in das neue Beispiel eingebaut, aber nicht erklärt...

GetTickCount() ist eigentlich eine Funktion der WinAPI, welche die Millisekunden ausgibt, seit das System läuft. Nicht sehr sinnvoll denkt ihr? Schaut mal her:

StartZeit := GetTickCount();

- Hauptprogramm -

EndZeit := GetTickCount();
LaufZeit := EndZeit - StartZeit;

Schon habt ihr die Zeit, die euer Hauptprogramm zum Ablauf benötigte. Da wir hier von Millisekunden reden haben wir auf jedem Rechner egal welcher Taktung die gleiche Zeiteinheit. Vorteil! Nix mehr BIOS Uhr manipulieren oder per Interrupt timen!

Ihr könnt GetTickCount() nutzen, um komplette Programme zu timen, oder auch nur einzelne Prozeduren. So könnt ihr im Auge behalten wie schnell ein Durchlauf dieser Prozedur ist. Oder gar einen FPS Counter für euer Programm!

"Und wie gibt man diese Informationen nun aus?" wäre die logische Frage. Sicherlich die bequemste Art wäre mit einem Font direkte Ausgaben am Bildschirm. Hatten wir aber noch nicht. Aber MessageBoxen hatten wir. Gehen wir einmal einen FPS Counter durch.

Wir benötigen eine Variable für die Startzeit, eine für die Endzeit. In einer Variable müssen wir die Anzahl der abgelaufenen Frames festhalten. Schließlich brauchen wir noch einen String, in den wir die Ergebnisse kopieren, da Windows Zahlen nicht so gerne hat und lieber pchar vorzieht. Dazu kommen der Einfachheit noch ein paar Temp-Variablen zur besseren Verständlichkeit, die aber weniger notwendig sind.

	StartZeit, EndeZeit, GesamtZeit, FPS, GesamtFrames : LongInt;
	Debug_String : pchar;
	TEMP_String : string;

Nun speichern wir die Zeit an der unsere Hauptschleife beginnt. Außerdem setzen wir die Anzahl der Frames auf eins.

...

StartZeit := GetTickCount();
Frames := 1;
repeat

...

Jetzt lassen wir gemütlich unser Programm durchlaufen wir normalerweise auch. Sobald aber der Befehl zum beenden des Programms gegeben wird, schreiten wir zur Tat.

FUNCTION WindowProc(Window: HWnd; AMessage, WParam, LParam: Longint):
Longint; stdcall; export;

BEGIN

  WindowProc:=0;
  case AMessage of
    wm_Destroy,  //KeyDown or Closed ??!
    wm_KeyDown : begin
                  thisistheend:=true;
		  ShowCursor(TRUE); 
		  CloseDirectDraw; //Close

  {---------Begin Debug Informaion--------------------------------------}

	EndeZeit := GetTickCount();
	GesamtZeit := EndeZeit - StartZeit;
	FPS := GesamtZeit div 1000;
	FPS := Frames div FPS;

	Debug_String := StrAlloc(20);

	Str(FPS,TEMP_String);
	TEMP_String := Concat(TEMP_String, ' FPS');
	StrPCopy(Debug_String, TEMP_String);
		  		  
	MessageBox(0, Debug_String, 'Debug Information', mb_Ok);

  {---------End Debug Information---------------------------------------}

		  ReleaseDC(hWindow,hHDC);
		  hHDC:=0;
		  PostQuitMessage(0);
          Exit;
          end;
  end;
  WindowProc:=DefWindowProc(Window, AMessage, WParam, LParam);

END;

In der WinProc merken wir, wenn das Programm beendet wird. Wenn ja, dann schließen wir unseren DirectDraw Kram und dann fängt der Spaß an. Wir überprüfen die aktuelle Zeit und errechnen aus der Differenz, wie lange unser Programm insgesamt gelaufen ist. Diesen Wert teilen wir durch 1000 (von ms auf s) und teilen ihn durch die Anzahl der insgesamt angezeigten Frames. Somit kommen wir auf die Frames per Second. Diesen Wert kopieren wir mit "str" in einen String und mit "concat" hängen wir noch die Buchstaben 'FPS' dahinter. Da Windows aber keine normalen Strings mag, sondern nur pchars konvertieren wir unseren String mit "StrPCopy". Den geben wir dann in der MessageBox aus.

In MessageBoxen lassen sich damit nicht nur Werte anzeigen, sondern auch Fehlermeldungen, Probleme beim Initialisieren etc...sehr nützlich das ganze! Man kann auch mit GetTickCounter die Frame Rate auf einen Wert festnageln. Einfach nur zu bestimmten Ticks das DirectDrawBlit() aufrufen. Wie immer viele Möglichkeiten und zu wenig Zeit. ;)

Delax/ Sundancer Inc.
[delax@sundancerinc.de]

Back to previous page

Useful Links









Link to us