CPU-Auslastung auf 100%
CPU-Auslastung auf 100%
Noch mal Hallo ZFX,
Ich habe hier eine Frage die bestimmt schon oft gestellt wurde^^
Aber ich frage trotzdem mal:
Meine Applikation läuft auf 100% (bzw. 25% bei quadCore) CPU-Auslastung.
Ist irgendwie nicht sooo doll, weil wird eigentlich nicht viel gemacht.
Andere Programme laufen ja auch kaum auf 100%... außer sie haben sehr viel zu berechnen.
Meine Spiel-Schleife ist daran auch schuld, das weiß ich.
Sie läuft eben die ganze Zeit in Höchstgeschwindigkeit durch und rendert oder verarbeitet Anweisungen...
Nur gibt es da alternativen?
Wißt ihr da etwas?
Gruß
Ich habe hier eine Frage die bestimmt schon oft gestellt wurde^^
Aber ich frage trotzdem mal:
Meine Applikation läuft auf 100% (bzw. 25% bei quadCore) CPU-Auslastung.
Ist irgendwie nicht sooo doll, weil wird eigentlich nicht viel gemacht.
Andere Programme laufen ja auch kaum auf 100%... außer sie haben sehr viel zu berechnen.
Meine Spiel-Schleife ist daran auch schuld, das weiß ich.
Sie läuft eben die ganze Zeit in Höchstgeschwindigkeit durch und rendert oder verarbeitet Anweisungen...
Nur gibt es da alternativen?
Wißt ihr da etwas?
Gruß
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: CPU-Auslastung auf 100%
VSync an?
- Sternmull
- Establishment
- Beiträge: 264
- Registriert: 27.04.2007, 00:30
- Echter Name: Til
- Wohnort: Dresden
Re: CPU-Auslastung auf 100%
Ich glaube nicht das deine Schleife in dem Fall wirklich so viele Durchläufe pro Sekunde machen muss. Die Darstellung kann ja eh nicht häufiger geschehen als es die Bildwiederholrate des Monitors zulässt. Das wären dann also z.B. so was wie 60 oder 75Hz. Ich weiß nicht was dein Spiel macht, aber wahrscheinlich könnte es die Abläufe von einem Frame bis zum nächsten in aller Ruhe berechnen und dann gemütlich auf die nächste Bildumschaltung warten. Idealerweise koppelt man sich dabei wirklich an die Bildwiederholrate, was in Spielen üblicherweise als "vsync"-Option zur Verfügung gestellt wird, oder man baut zumindest eine Rechenpause ein die so lange dauert bis man den nächsten Frame präsentieren will.
Re: CPU-Auslastung auf 100%
Ja, habe ich eben gemacht... also wenn es das ist:
http://www.glfw.org/docs/latest/group__ ... 13202994ed
Habe mit damit mal etwas rumgespielt (zB glfwSwapInterval(5)), CPU läuft immer noch auf 25% (=100% auf einem Core)...
http://www.glfw.org/docs/latest/group__ ... 13202994ed
Habe mit damit mal etwas rumgespielt (zB glfwSwapInterval(5)), CPU läuft immer noch auf 25% (=100% auf einem Core)...
Re: CPU-Auslastung auf 100%
Naja, ich würde ja gerne das Programm etwas warten lassen...
Habe auch diese Funktion gefunden:
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Nur ist sie halt auf Windows beschränkt.
Müsste ich vlt. mal googlen...
Habe auch diese Funktion gefunden:
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx
Nur ist sie halt auf Windows beschränkt.
Müsste ich vlt. mal googlen...
Re: CPU-Auslastung auf 100%
Okay, habe gerade etwas gefunden:
Die 10 ist erstmal nur ein Platzhalter... ich denke 1/60s wäre da besser :)
Code: Alles auswählen
#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::milliseconds(10));
Re: CPU-Auslastung auf 100%
In zukunft werde ich vorher Google befragen... verdammter Kommunikationsbedarf^^
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: CPU-Auslastung auf 100%
Wenn es ein 3D-Spiel ist, ist Schlafen das Schlimmste, was du machen kannst. Die scheiß frühen GTAs haben es auch so gemacht und stottern noch heute auf 25 fps dahin. Wäre höchstens für rundenbasierte Sachen okay.
Wie viele Bilder pro Sekunde laufen denn gerade durch?
Wie viele Bilder pro Sekunde laufen denn gerade durch?
Re: CPU-Auslastung auf 100%
Schlafen ist doof idealerweise wartest du besser auf eine Condition/Event (WaitFor SingleObject() bzw. boost::timed_wait sind hier die Stichworte).
Re: CPU-Auslastung auf 100%
Also, mein Programm läuft nun nicht mehr auf 100%.
Der Grund war, und das ist mir jetzt etwas peinlich, ich habe mir eine schleife gebastelt, die ständig die Zeit abfragt und nach einer bestimmten zeit diese Schleife verlässt. Sozusagen ein simples delay(time).
Grund war, weil ich meine alte Grafikkarte schonen wollte... zumindest dachte ich das, weil sie eben oft "abgeschmiert" ist. Da dachte ich, es liegt am ständigen Zeichnen.
Ich habe jetzt diese Schleife entfernt und das Programm läuft jetzt so bei ca. 10%.
Ich render noch nicht viel, aber ich wollte das vorher schon abklären...
Was die FPS betrifft:
Muss ich mal abfragen und kann ich hier auch posten.
Und was diese Stichworte betreffen, kann ich ja mal googlen...
Der Grund war, und das ist mir jetzt etwas peinlich, ich habe mir eine schleife gebastelt, die ständig die Zeit abfragt und nach einer bestimmten zeit diese Schleife verlässt. Sozusagen ein simples delay(time).
Grund war, weil ich meine alte Grafikkarte schonen wollte... zumindest dachte ich das, weil sie eben oft "abgeschmiert" ist. Da dachte ich, es liegt am ständigen Zeichnen.
Ich habe jetzt diese Schleife entfernt und das Programm läuft jetzt so bei ca. 10%.
Ich render noch nicht viel, aber ich wollte das vorher schon abklären...
Was die FPS betrifft:
Muss ich mal abfragen und kann ich hier auch posten.
Und was diese Stichworte betreffen, kann ich ja mal googlen...
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: CPU-Auslastung auf 100%
Wenn du jetzt bei 10 % bist, funktioniert es wahrscheinlich gut.
Ich habe nur nach den FPS gefragt weil man daran sehen kann, ob VSync wirklich funktioniert: Hast du Vsync eingeschaltet, aber trotzdem 800 fps, dann sind vielleicht die Grafiktreibereinstellungen durcheinander und darum frisst das Programm so viel Zeit. Wären es nur 60 oder 85 gewesen, hätte ich als nächstes nach genau dem gesucht, was du jetzt schon gefunden hast: Eine wildgewordene Schleife.
Warten/Schlafen brauchst du jetzt nicht mehr. Sobald VSync an ist, wartet die Grafik-API selbstständig darauf, dass der Monitor für das nächste Bild bereit ist. Das Programm verbraucht nun nur noch so viel CPU-Zeit, wie es unbedingt muss.
Ich habe nur nach den FPS gefragt weil man daran sehen kann, ob VSync wirklich funktioniert: Hast du Vsync eingeschaltet, aber trotzdem 800 fps, dann sind vielleicht die Grafiktreibereinstellungen durcheinander und darum frisst das Programm so viel Zeit. Wären es nur 60 oder 85 gewesen, hätte ich als nächstes nach genau dem gesucht, was du jetzt schon gefunden hast: Eine wildgewordene Schleife.
Warten/Schlafen brauchst du jetzt nicht mehr. Sobald VSync an ist, wartet die Grafik-API selbstständig darauf, dass der Monitor für das nächste Bild bereit ist. Das Programm verbraucht nun nur noch so viel CPU-Zeit, wie es unbedingt muss.
Re: CPU-Auslastung auf 100%
Also, ich habe jetzt mal die FPS gecheckt, und kam auf erschreckende ~1980fps!
Dann habe ich mit glfwSwapInterval herumexperimentiert, jedoch ohne große Änderung der Framerate.
Dann habe ich bei meine Grafikkarte den VSync eingeschaltet, und siehe da, die Anwendung läuft jetzt bei 50fps.
Nur frage ich mich, wie ich den VSync in meiner Anwendung einstellen kann... :?:
Dann habe ich mit glfwSwapInterval herumexperimentiert, jedoch ohne große Änderung der Framerate.
Dann habe ich bei meine Grafikkarte den VSync eingeschaltet, und siehe da, die Anwendung läuft jetzt bei 50fps.
Nur frage ich mich, wie ich den VSync in meiner Anwendung einstellen kann... :?:
Re: CPU-Auslastung auf 100%
Hi,
also ich dachte das geht einfach mit glfwSwapInterval.
Das Verzögert die Frame-Anzeige später im "glfwSwapBuffers"-Call.
Bei mir funktioniert das jedenfalls ganz gut (ich benutze aber auch eine relativ neue Version von glfw, ich glaube da gabs bugs...).
Wenn ich die Framerate nicht begrenzen will, benutze ich auch gerne am Ende des Frames ein
Die Funktion verursacht einfach ein re-evaluieren der Tasks im Windows-OS-Scheduler, ohne wirklich zu Schlafen. Das funktioniert relativ gut und lässt andere Programme noch "atmen".
Und die Verzögerung am Ende des Frames lässt sich da gut verkraften, ein DirectX-Aufruf in die WINAPI über DLL/Ring-Grenzen hinweg macht das meist sowieso.
Auch wenn die Lösung eher diskussionswürdig ist :D , ist es aus meiner Erfahrung heraus immernoch besser als 100%CPU usage, busy loops oder Lösungen mit "WaitForSingleObject"-Geraffel.
Aus der WINAPI Doku:
also ich dachte das geht einfach mit glfwSwapInterval.
Das Verzögert die Frame-Anzeige später im "glfwSwapBuffers"-Call.
Bei mir funktioniert das jedenfalls ganz gut (ich benutze aber auch eine relativ neue Version von glfw, ich glaube da gabs bugs...).
Code: Alles auswählen
void VSyncOn() {
glfwSwapInterval(1);
}
void VSyncOff() {
glfwSwapInterval(0);
}
Code: Alles auswählen
Sleep(0);
Und die Verzögerung am Ende des Frames lässt sich da gut verkraften, ein DirectX-Aufruf in die WINAPI über DLL/Ring-Grenzen hinweg macht das meist sowieso.
Auch wenn die Lösung eher diskussionswürdig ist :D , ist es aus meiner Erfahrung heraus immernoch besser als 100%CPU usage, busy loops oder Lösungen mit "WaitForSingleObject"-Geraffel.
Aus der WINAPI Doku:
A value of zero causes the thread to relinquish the remainder of its time slice to any other thread that is ready to run.
If there are no other threads ready to run, the function returns immediately, and the thread continues execution.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: CPU-Auslastung auf 100%
Du *hast* VSync in deiner Anwendung eingeschaltet. Aber wenn der Anwender in seinem Grafiktreiber VSync abschaltet, dann kannst du nichts machen; er *will* 100 % CPU-Auslastung und Tearing und ist selber schuld. So einfach ist das.joggel hat geschrieben:Nur frage ich mich, wie ich den VSync in meiner Anwendung einstellen kann... :?:
-
- Establishment
- Beiträge: 117
- Registriert: 17.09.2002, 17:27
- Echter Name: Manuel Hofmann
- Wohnort: Rottweil
- Kontaktdaten:
Re: CPU-Auslastung auf 100%
Hallo !
Hier meine Erfahrung und Wissen darüber:
Grundsätzlich programmiere ich die Hauptschleifen immer so, dass die Auslastung potentiell 100%
beträgt.
Normalerweiße bin ich dabei für asynchrone Strukturen (ich hasse z.B. schlafen, weil das dem Konzept
überhaupt nicht genügt).
Allerdings kann 100% auch gefährlich werden.
Ich hatte mal ein Projekt mit einem Jahr Entwicklungszeit, welches mittels Evolutionsalgorithmus seine
Parameter berechnen sollte. Dies lief mit 100% ein Paar Tage - dann war das Notebook kaputt :(.
Ergänzung: Mit dem Kaputtgehen vom Notebook könnten auch noch andere Faktoren eine Rolle gespielt haben- denn ich glaube so schnell geht so ein System nicht zu Grunde. Trotzdem wars wohl ein Faktor.
Ich hoffe, ich konnte mich einbringen.
Gruss
RedGuy
Hier meine Erfahrung und Wissen darüber:
Grundsätzlich programmiere ich die Hauptschleifen immer so, dass die Auslastung potentiell 100%
beträgt.
Normalerweiße bin ich dabei für asynchrone Strukturen (ich hasse z.B. schlafen, weil das dem Konzept
überhaupt nicht genügt).
Allerdings kann 100% auch gefährlich werden.
Ich hatte mal ein Projekt mit einem Jahr Entwicklungszeit, welches mittels Evolutionsalgorithmus seine
Parameter berechnen sollte. Dies lief mit 100% ein Paar Tage - dann war das Notebook kaputt :(.
Ergänzung: Mit dem Kaputtgehen vom Notebook könnten auch noch andere Faktoren eine Rolle gespielt haben- denn ich glaube so schnell geht so ein System nicht zu Grunde. Trotzdem wars wohl ein Faktor.
Ich hoffe, ich konnte mich einbringen.
Gruss
RedGuy
homepage: http://ncores.de