| Autor |
Beitrag |
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: So 06.04.03 18:47
| mimi hat folgendes geschrieben: | was sind denn HighEnd Spiele ?
(kenne ich davon welche ?) |
Damit meinte ich jetzt sowas wie Unreal 2 und so... wobei ich da Keine ahnung habe wo die ihren RenderLoop aufrufen
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 06.04.03 19:51
toll....
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
OregonGhost
      
Beiträge: 215
|
Verfasst: Do 10.04.03 16:43
Da ihr mir ja ohnehin nicht glaubt, schließe ich das Thema für mich mit diesem Post ab, natürlich in dem Wissen, recht zu haben ;c)
Unter Windows hat jede Anwendung ohnehin eine Message Loop. In Spielen wird diese nur leicht umfunktioniert (besonders die VCL-Message Loop kommt schon sehr nahe ran) und wird so zur Gameloop. Die Gameloop wird in der Eintrittsfunktion des Programms aufgerufen, also in der WinMain, oder in einer Unterfunktion, jedoch nicht in einem Ereignis. Ein Ereignis kann ohne die Message- bzw. Gameloop nämlich gar nicht auftreten.
Als Delphianer kann man sie auch alternativ in das Programm in den begin-end-Block schreiben, kommt auf's selbe raus. Weder OnIdle noch Timer (inklusive DXTimer, diese sind vielleicht für Multimedia-Anwendungen geeignet, aber nicht für Spiele) werden häufig in Spielen verwendet. Das schließt nicht nur professionelle Spiele wie Unreal II ein, sondern auch viele Hobby-Spiele. Dass viele Hobby-Spiele aber eben auch Timer und OnIdle verwenden, ist genau ein Fehler der Hobby-Programmierer und nicht einer der Professionellen. Fehler zumindest in soweit, als dass es der falsche Weg ist, wenn man den Sinn sowohl von OnIdle als auch von Timern betrachtet. Dazu verweise ich auch nochmals auf Robert Dunlops Artikel.
Aus verschiedenen Gründen kommt die Gameloop normalerweise auch nicht in einen anderen Thread, aber das hängt natürlich mit der Architektur sowohl der Gameloop als auch der API zusammen.
_________________ Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Do 10.04.03 16:49
huhu,
| Zitat: | | Ein Ereignis kann ohne die Message- bzw. Gameloop nämlich gar nicht auftreten. |
das ergeiniss OnIdle der VCL wird doch im MessageLoop aufgerufen... Wenn du etwas in den OnIdle Event schreibst, ist das gleichbedeutend damit wie wenn du es in die MessageLoop reinschreibst
und, ob ich nun den OnIdle Event nehme, oder zwischen Begin/End schreibe ist exakt dasselbe... denn der OnIdle Event wird zwischen Begin/End aufgerufen
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
OregonGhost
      
Beiträge: 215
|
Verfasst: Do 10.04.03 17:08
Nochmal zum Mitschreiben: OnIdle wird aufgerufen, wenn die Anwendung gerade nichts zu tun UND wenn Windows meint, dass es keine anderen Anwendungen gibt, die was zu tun haben. Es wird nicht unbedingt ständig aufgerufen, und es gleichzusetzen mit dem begin-end ist Schwachsinn. Zitat aus der Delphi-Hilfe:
| Zitat: |
Auf Basis von OnIdle können Sie eine Ereignisbehandlungsroutine programmieren, mit der Sie bestimmte Aktionen auslösen können, wenn sich die Anwendung im Leerlauf befindet. Eine Anwendung befindet sich beispielsweise im Leerlauf, wenn eine Benutzereingabe erwartet wird.
[...]
OnIdle wird nur einmal aufgerufen, wenn die Anwendung in den Leerlauf übergeht. Das Ereignis wird nur dann fortlaufend ausgelöst, wenn Done auf False gesetzt wird. Das bedeutet, daß diese Anwendung übermäßig viel CPU-Zeit beansprucht, was die Leistung des gesamten Systems beeinträchtigt. |
Ich will dir damit deine OnIdle-Benutzung ja nicht schlecht machen, aber es ist einfach der falsche Weg, und der andere Weg ist nur minimal umständlicher, dafür aber wesentlich flexibler und leistungsfähiger.
_________________ Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Do 10.04.03 17:20
| OregonGhost hat folgendes geschrieben: | | Nochmal zum Mitschreiben: OnIdle wird aufgerufen, wenn die Anwendung gerade nichts zu tun UND wenn Windows meint, dass es keine anderen Anwendungen gibt, die was zu tun haben. |
OnIdle wird aufgerufen wenn die eigene Anwendung nichts zu tun hat, ja.. aber es hat nichts damit zu tun ob ne andere Anwendung was macht.
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 10.04.03 21:22
wie gesagt ich würde es in einem Timer oder in einem Thred(oder wie das heißt) machen;)
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
CastleArts
Hält's aus hier
Beiträge: 10
|
Verfasst: Sa 19.04.03 16:55
Ist das Einfachste nicht die simple TimeGetTime Methode?
Sie gibt die Zeit in Millisekunden an, wie lang Windows schon läuft.
Ich glaub sie ist in der Unit mmsystem enthalten...(einfach mal die Hilfe zu TimeGetTime über F1 suchen).
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var time : integer; RenderingTime : integer; fps : real;
begin time := TimeGetTime; //Deine Berechnungen... RenderingTime := TimeGetTime - time; //Gibt die benötige Zeit in Millisekunden zurück fps := 1000 / RenderingTime; //der Kehrwert entsprich dann also den fps end; |
MfG,
Magnus Schlösser
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Sa 19.04.03 17:53
er will doch nicht wissen wie lange Windows schon läuft
sondern er will die FPS berechnent haben
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
CastleArts
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 21.04.03 01:28
Äh die Windowslaufzeit ist doch nur Mittel zum Zweck, die absolute Zeit spielt nämlich gar keine Rolle.
Nochmals im Detail:
1. Die Zeit wird geholt und in einer Variablen gespeichert.
2. Danach wird der Bildaufbau etc. berechnet.
3. Die Zeit wird wiederrum genommen und die Differenz ergibt die Rechenzeit für den Bildaufbau in Millisekunden.
4. Der Kehrwert der Rechenzeit (1 / t) ergibt dann die Bilder pro Millisekunde
5. Das Ganze mal Tausend und schupp-die-wupp hat man die FPS! (frames per second)
Die meisten meiner "Delphi-Kollegen verwenden die Methode"!!!
MFG, Magnus
P.S. Verstanden Mimi?? :wink:
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mo 21.04.03 15:40
Naja, wenn es funktioniert 
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|