Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 04:50

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Idle handler ausschalten
BeitragVerfasst: So Jun 04, 2006 21:02 
Offline
DGL Member

Registriert: So Mai 28, 2006 03:15
Beiträge: 18
Aloha,
ich habe mir ja eine Grundversion des Spieles Pong gebastelt, da dachte ich mir, dass es doch feiner wäre, wenn das Spiel nicht gleich starten würde sondern man es erst im Programm starten muss.
Ist ja auch kein Problem, ich rufe den IdleHandler einfach wann anders auf (also nicht bei FormCreate ^^).
Aber wenn ich das Spiel jetzt beenden will, dann muss ich ihn ja wieder ausschalten.
Ich habe das mit
Application.OnIdle := nil;
gelöst... dabei habe ich aber eher geraten ob das funktioniert.
Tja Glück gehabt :wink: .
Nun bin ich mir aber nicht sicher ob ich ihn wirklich abschalte oder nur nichts gemacht wir... aber eben wieder immer wieder nichts gemacht wird.
Also Frage konkret: schaltet man den IdleHandler so wie ich das gemacht habe ab, oder verwirklicht man das anders?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 04, 2006 21:31 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ja. Deshalb muß man vor dem Aufruf von Events auch immer prüfen, ob sie nicht nil sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 04, 2006 21:43 
Offline
DGL Member

Registriert: So Mai 28, 2006 03:15
Beiträge: 18
Danke, auch für den Hinweis, das man vor dem Aufruf testen sollte, ob das Event nil ist.
Wusste ich noch nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 04, 2006 23:39 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also wenn ich dich gerade richtig verstanden habe, dann möchtest du nicht, dass dein Spiel direkt anfängt, sodnern du erst in eine Art Menü kommst, von wo aus du dann ins eigentliche Spiel gelangst?

Wenn dem so ist, dann musst du den Idle Handler nicht abschalten. Du kannst das Menü ja auch mit OGL machen. Du musst dann beim rendern nur unterscheiden was gezeichnet werden soll: Das Menü, oder das Spiel.

Nur so als Inspiration ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 05, 2006 01:40 
Offline
DGL Member

Registriert: So Mai 28, 2006 03:15
Beiträge: 18
Naja, ist mein erstes kleines Spiel in OpenGL, da war mir ein extra Menü in OpenGL zu viel Arbeit.
Da ich sowieso noch eine echte VCL Form verwende habe ich da einach so ein Menü Teil dazugepackt (ich glaube das heißt sogar TMenu ^^).
So extrem komfortabel muss das ja nicht werden :lol: .

Aber um auf deine Inspiration zurückzukommen... evtl. habe ich irgendwann ja die Muse dazu, nur würde ich da nicht direkt ein Problem, aber doch was unschönes sehen:
Wie ich dich verstehe zeichnet OpenGL dann ständig etwas... also ohne Unterlass, zwar mit einem IdleHandler, aber eben doch praktisch Schleifenhaft.
Bei großen Spielen erwartet man ja eine entsprechende Prozessorauslastung, aber bei kleineren würde ja auch eine ständige (größer oder kleinere) Belastung vorhanden sein, wenn man das Menü auch in den IdleHandler packt, oder?
Denn wie ich das verstanden habe kommt der IdleHandler ja laufend zum Einsatz wenn nichts zu tun ist.

Ich dachte da wäre es besser, wenn nicht gespielt wird, dass man den IdleHandler ausschaltet, einmal das Menü zeichnet (somit natürlich nicht animiert) und dann, wenn es weitergehen soll wieder den IdleHandler wieder anschaltet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 06, 2006 12:37 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Da hast du recht. Man kommt (mit nem Sleep im Handler) auf ca 80% Prozessorlast. Aber der Idle-Handler nutzt nur Zweit die eh zur verfügung steht. Dahingehend ist das ziemlich egal.

Außerdem... Wenn jemand ein Spiel spielt, brauch er nix anderes mehr zu machen. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 06, 2006 13:41 
Offline
DGL Member

Registriert: So Mai 28, 2006 03:15
Beiträge: 18
Flash hat geschrieben:
Außerdem... Wenn jemand ein Spiel spielt, brauch er nix anderes mehr zu machen. ;)

Wenn man so überzeugt von seinem Spiel ist, dann kann es nur gut sein :D .
Allerdings bin ich mir da bei einem billigem Pong Klon nicht so sicher.
Aber wenn der IdleHandler nur das nutzt was eh zu Verfügung steht wäre es ja nicht schlimm.
Ich dachte nur dass es besser ist, wenn man z.B. im Hintergrund noch Programme (Musik, Download, Antiviren und was weiß ich noch..) zu laufen hat, diesen Ressourcen weggenommen werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 06, 2006 14:31 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Nein. IdleHandler wird nur gerufen, wenn das System sonst nix zu tun hat (Scheduler sorgt schon dafür, dass die anderen auch dran kommen), sprich wenn idle-prozess dran wäre.
Idle bezieht sich auf die Anwendung selber, kann also anderen keine Ressourcen klauen (ausser Du stellst deinen Pong auf echtzeit im task manager ;))

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 06, 2006 14:51 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Für mich persönlich ist es OK, wenn meine Programme das System auf ca 90% Last bringen. Das ist für den Akku vom Laptop zwar nicht so toll, aber immerhin ist sichergestellt, das der Rechner noch Kapazitäten hat um auf wichtige Eingaben zu reagieren.

Durch das Einbauen von Sleep() in den Idle-Handler kannst du die Auslastung auf ca 70% senken. Das ist akzeptabel, denk ich.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 06, 2006 18:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Interessant ist auch der Unterschied zwischen Sleep(0) und Sleep(1).
Bei Sleep(0) ist das Ergebnis das von Flash beschriebene, mit Sleep(1) konnte ich die Prozessorauslastung auf 0-5 % bringen.

Allerdings benutze ich sowieso einen FrameLimiter auf 400 FPS. Immer wenn sonst ein Exit kommen würde, mache ich jetzt Sleep(1); exit;
Interessant ist auch, das der User den Unterschied nicht merkt ;)

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 23, 2006 09:46 
Offline
DGL Member

Registriert: So Jun 18, 2006 13:36
Beiträge: 12
Bei Delphi sieht die Verarbeitungsreihenfolge so aus:

1. Windows-Botschaften verarbeiten
2. Wenn keine da, interne Aufgaben abarbeiten
3. Wenn keine da, Idlehandler aufrufen

D.h. egal was man in den Idle-Handler packt, es werden alle anderen Aufgaben trotzdem und zuerst ausgeführt.


Was das Sleep angeht: Windows arbeitet mit Zeitscheiben, sprich ein Prozess bekommt, wenn er Rechenzeit bekommt, mindestens 15-20 ms Zeit zum Rechnen (der genaue Wert hängt vom Prozessor ab). D.h. wenn ich einen Sleep(1) mache gebe ich kurzfristig die Kontrolle an Windows zurück und "bestelle" eine neue Scheibe Rechenzeit für in 1 ms. Windows selbst lässt dann aber erstmal einen anderen Prozess 15-20 ms rumrechnen bevor mein Programm die neue Zeitscheibe bekommt. Das ist zwar was genaues Timing angeht ärgerlich, aber für Windows durchaus sinnvoll, denn zwischen Prozessen wechseln kostet auch Rechenzeit, und sonst wäre die CPU mehr mit prozesswechseln beschäftigt als mit der eigentlichen Anwendung.


Um die Prozessorauslastung zu minimieren, kann man bei Spielen die keine hohe Framerate brauchen (Pong ;)) auch einfach die Framerate auf 30 fps begrenzen. Alles über 30 fps merkt der User sowieso nur dann wenn sehr viel präziese Bewegung im Spiel vorkommt (3D-Shooter).

Bei mir sieht das beispielsweise so aus (wobei FPS_TARGET = 30):
Code:
  1. estimatedrendertime := 1000 div FPS_TARGET;
  2.  
  3. procedure TFormMain.IdleHandler(Sender: TObject; var Done: Boolean);
  4. var
  5.   start, drawtime, sleeptime: cardinal;
  6. begin
  7.   start := GetTickCount;
  8.   Render3d;
  9.   drawtime := GetTickCount - start;
  10.  
  11.   if (drawtime < estimatedrendertime) then begin
  12.     sleeptime := estimatedrendertime - drawtime;
  13.     if (sleeptime > 20) then  // Alles unter 20 ms bringt nichts, weil Windows sowieso mindestens 15-20 ms wartet
  14.       sleep(sleeptime);
  15.   end;
  16.  
  17.   done := false;
  18. end;


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]