Autor Beitrag
Passi077
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win XP
D7 Pers
BeitragVerfasst: Di 02.11.04 19:18 
Hi,

ich brauche einen genauen Timer und möchte eigentlich nur Hauseigene Delphimittel benutzen.

Also habe ich mit GetTickCount angeschaut und folgenden Code geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
begin
while not a do begin
    i:=gettickcount;
    Application.ProcessMessages;
    label1.Caption := inttostr(i);
//    sleep(1);
end;


Wobei a niemals true ist.

Dummerweise braucht diese kleine Schleife, die eigentlich ja noch gar nichts macht, 100% CPU-Auslastung. Außerdem trotz ProcessMessages kann ich z.B. den Schließen Button nicht klicken, bzw. es wird nicht geschlossen.

Mit Sleep wird die CPU Last zwar geringer, allerdings kann ich dann trotzdem immer noch nicht andere Befehle gleichzeitig ausführen.

Was kann ich da tun?

Grüße
Passi
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 02.11.04 19:51 
Du solltest dir mal die Methoden QueryPerformanceFrequency und QueryPerformanceCounter anschauen. Die sind wesentlich genauer als GetTickCount.

Das einfachste wäre du würdest das in einen extra Thread auslagern. Tutorial über Threads.

Evtl. gibt es ja eine andere Lösung als eine Busywaitingschleife. Die ist nämlich nicht unbedingt die sauberste Art zu programmieren. Was hast du denn bitte genau vor?

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Passi077 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win XP
D7 Pers
BeitragVerfasst: Di 02.11.04 20:07 
Soll ein einfaches kleines Spiel mit Canvas werden.

Geht einfach nur darum, dass es auf einem 3Ghz Rechner genau so schnell läuft wie auf einem mit 300Mhz.

Es muss also nicht ms genau oder so sein. Ich will damit einfach quasi eine konstante Framerate erzeugen, in der ich dann die nötigen Bewegungen etc. und das Canvas-Draw Ereigniss aufrufe.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 02.11.04 21:58 
Dachte ich es mir doch. Also dein zauberwort heißt TimeBasedMovement. Du misst die Zeit für 1 Frame und bewegst deine Objekte mit diesem Faktor. Also umso mehr frames umso kleiner die schritte. Dort kannst du auch ein sleep einbauen das rechnet sich dann mit ein.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Jörg1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Fr 24.12.04 13:42 
Titel: Programm schließen
Hallo,

Meinst du mit dem Schließen-Button das Schließen-Kreuz vom Fenster? Wenn ja, erzeuge eine OnClose-Prozedur des Formulars und setzte in dieser a auf true. Jetzt hat das Programm die Möglichkeit, die Schleife zu verlassen und das Programm zu schließen. ich beschäftige mich nämlich auch mit der Entwicklung einer Spielschleife und verwende dabei auch die "while"-Technik in Verbindung mit 'Application.ProcessMessages' . Dabei ist mir auch schon aufgefallen, daß das den Rechner sehr stark belastet, obwohl eigentlich noch nichts abgearbeitet wird.
Jörg1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mo 27.12.04 19:35 
Titel: 100% CPU-Auslastung
Hallo,

nochmal auf die 100% CPU- Auslastung zurückzukommen. Ich habe es mal mit meiner Schleife probiert, also hab sie laufen lassen und gleichzeitig den Taskmanager. Sofort geht die Auslastung auch hoch auf 100%.
Da ich es aber genau wissen wollte, hab ich das gleiche mal mit professionellen Spielen überprüft. Und siehe da, ebenfalls eine 100% CPU- Auslastung. Daraus schließe ich, das es der CPU mehr oder weniger egal ist,
was oder wieviel innerhalb einer Gameloop abgearbeitet wird. Maßgebend ist anscheinend wohl, daß das Programm, während die Schleife läuft, sich halt nicht im Leerlauf befindet, und eben das treibt die Auslastung in die Höhe.
In einem Buch über Spieleprogrammierung, daß ich zufällig mal in die Hände bekam, wird eine Gameloop beschrieben, die auch auf einer while-Schleife basiert und solange endlos durchläuft, bis eine bestimmte Situation und/oder Nachricht eintritt.
Also kann meiner Meinung nach eine Gameloop, die mit einer while-Schleife realisiert wird, zumindestens nicht ganz falsch oder schlecht sein. Natürlich ist es zwingend notwendig, eine künstliche Bremse in Form einer Frameratenbegrenzung
einzubauen. Der Performance-Counter(Hardwarebaustein) ist dafür das absolut genaueste. Bei meinem Programm werde ich es jedoch anders versuchen, so nach der Art : aktuelle_zeit : TDateTime / aktuelle_zeit := Now / DecodeTime(aktuelle_zeit, stunde, minute, sekunde, millisekunde),
wobei für mich nur die millisekunde interessant ist. Mal sehen, ob ich das damit überhaupt so hinbekomme, wie ich es mir vorstelle.