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 .
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?
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
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 .
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.
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
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 .
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.
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.
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
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
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):
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.