Registriert: Sa Nov 13, 2004 11:00 Beiträge: 229 Wohnort: Steinhude
wenn ich mich jetz richtig erinnere war die auflösung von sleep nicht so dolle, vll. könnte das daran liegen (auf anhieb fallen mir jedenfalls keine fehler auf, häng aber auch grad innen seilen )
Registriert: Mi Dez 15, 2004 20:36 Beiträge: 454 Wohnort: Wien, Österreich
Zitat:
wenn ich mich jetz richtig erinnere war die auflösung von sleep nicht so dolle, vll. könnte das daran liegen (auf anhieb fallen mir jedenfalls keine fehler auf, häng aber auch grad innen seilen
Das habe ich auch befürchet...
_________________ "Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump
Guck mal in verschiedenen Delphi Foren, ga gibts genug Threads!
_________________ Shareholder und Leitender Entwickler bei Pipedream-Games.
Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.
also auch wenn ich den sinn von soetwas ebenfalls nicht ganz nachvollziehen kann... einen vorschlag will ich trotzdem machen
Wenn du das ganze via Sleep machst, läufst du große gefahr das es ganz stark ruckelt... weil, wenn eine GraKa z.B. normal 100 FPS schafft, du sie aber auf 30FPS limitierst, würde das bedeuten das du in den ersten 30 huntertstel Sekunden die Scene 30x zeichnest und dann für 0.7 Sekunden ein standbild hast...
viel eher würde ich das ganze via QueryPerformanceCounter machen.
Du willst 30FPS maximal... also die QueryPerformance-Frequency / 30.0.. und die scene immer nur dann zeichnen wenn die QPC-Timer-Zeit wieder eine 30igstel Sekunde weiter ist.
Damit bekommst du auf die sekunde dann 30 frames gleichmäßig verteilt hin, und es würde auch funktionieren wenn eine GraKa nur 10fps schafft, statt der 30..
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich denke mal Notebookesitzer werden dir solche eine Option danken. Abgesehen davon finde ich es zum Beispiel auch lächerlich, wenn zum Beispiel ein Bildschirmschoner zwar den Bildschirm mit einem dunklem Bild "schont" aber dafür die CPU dauerhaft belastet. Außerdem ist es egal ob ich 50 oder 100 Bilder in der Sekunde sehe. Einen großen Unterschied macht es nicht. Dafür ist alleine das menschliche Auge zu träge.
Also ich hatte so etwas auch schon mal mit einem Sleep gemacht und wenn du das zusaätzlich zum Sleep noch den PerformanceCounter zu rate ziehst sollte das eigentlich gehen. Wie ich das genau gemacht hatte weiß ich nicht hundertprozentig. Ich meine ich hätte ausgerechnet alle 20ms Sekunden ein Bild und 12 hat das Bild gedauert. Dann hatte ich halt 8 gewartet. Evtl hatte ich die Zeit des Renderns und des Wartens noch in das nächste Bild mit einfließen lassen. Also Er hatte aber insgesammt 1 ms länger gebraucht. Also beim nächsten mal wartet er dann 1ms weniger. etc.
Evtl könntest du ja auch nen Timer nehmen. Die Zeiten sind zwar nicht so genau. Aber das könnte man evtl durch ein wenig Zeitmessung ausgleichen. Wenn die Leistung nicht ausreicht, dann wartet er ja auch brav. Und so hast du kein direktes Sleep und die Anwendung ist noch voll Funktionsfähig.
Registriert: Fr Mai 14, 2004 18:56 Beiträge: 804 Wohnort: GER/OBB/TÖL-WOR/Greiling
wenn man in einer OnIdle-Schleife immer wieder den performancecounter überprüft, zieht dass doch auch CPU-Auslastung, oder?
Denn es ist ja egal, ob die CPU 100 mal berechnet oder ob sie 1000 mal nur prüft, ob sie etwas zu berechnen hat.
Wäre da nicht ein Timer besser?
viel bringt - v.a. für einen Bildschirmschoner - auch wenn man im OnIdle das Done auf true setzt. somit wird die szene nur neugezeicdhnet, wenn sich wirklich etwas ändert. da reicht dann eigentlich auch schon ein OnTimer als Starthilfe, wenn alle Berechnungen, die am Bild etwas ändern, erst im OnIdle selbst durchgeführt werden.
Ganz simpel gefragt: Warum nicht einfach auf den VSync warten? Das begrenzt die Framerate auf Notebooks automatisch auf 60 und bei Röhrenmonitoren üblicherweise auf maximal 100... Schlecht ist das keinesfalls (im Zweifel sieht alles sogar deutlich flüssiger aus, zumindest bei CRTs) - und die CPU wird auch nicht zu 100% ausgelastet.
Registriert: Mo Feb 24, 2003 18:19 Beiträge: 165 Wohnort: Cologne
das Problem mit (Standard)Timern ist, das viel zu ungenau sind - ganz grausam ist das AFAIK sogar noch bei Win9X Und VSync macht die Sache auch nicht besser, da man so nur sehr begrenzt die Framerate beeinflussen kann - und dem Benutzer einfach die Bildwiederholungsrate verstellen ist für meinen geschmack doch sehr unfreundlich. Ich denke Aya's Vorschlag ist schon der beste Weg - ich denke es geht hier nicht (nur) um die Auslastungsverhinderung der CPU sondern auch der GPU - jeder Notebookbesitzer mit temperaturabhängigem aktiven Kühler wird es dir danken
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Die Idee mit VSync dir Framerate zu begrenzen st ja durchaus auch gar nicht so doof. Hat aber einne Hacken. Beim Warten auf das Syncsignal verbrät er selber 100% CPU Leistung, da das Signal nur für den Bruchteil einer ms gesendet wird. Hat also im Endeffekt nur den Vorteil, dass die Frameraten begrenz werden. Und man kann den außerdem noch fest im Treiber auf immer aus stellen. Somit hat das dann kaum nährwert.
Registriert: Fr Mai 14, 2004 18:56 Beiträge: 804 Wohnort: GER/OBB/TÖL-WOR/Greiling
genau das meine ich: sowohl die lösung mit queryperformancecounter als auch mit vsync hat die eigenart, die CPU-Auslastung trotzdem auf 100 zu bringen.
Gibt es nicht bei den Jedi's einen präzisen Timer? Denn das erscheint mir als einzige Möglichkeit, und auch der Standardtimer wird wohl bei 50 fps(=intervall von 20) noch genau genug sein.
eigentlich geht es ja nicht darum, die framerate auf 5 stellen hinter dem dezimalpunkt genau festzulegen, sondern darum, die CPU zu entlasten.
Mitglieder in diesem Forum: Bing [Bot] und 4 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.