CPU-Auslastung auf 100%

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
joggel

CPU-Auslastung auf 100%

Beitrag von joggel »

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ß
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: CPU-Auslastung auf 100%

Beitrag von Krishty »

VSync an?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: CPU-Auslastung auf 100%

Beitrag von Sternmull »

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.
joggel

Re: CPU-Auslastung auf 100%

Beitrag von joggel »

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)...
joggel

Re: CPU-Auslastung auf 100%

Beitrag von joggel »

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...
joggel

Re: CPU-Auslastung auf 100%

Beitrag von joggel »

Okay, habe gerade etwas gefunden:

Code: Alles auswählen

#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::milliseconds(10));
Die 10 ist erstmal nur ein Platzhalter... ich denke 1/60s wäre da besser :)
joggel

Re: CPU-Auslastung auf 100%

Beitrag von joggel »

In zukunft werde ich vorher Google befragen... verdammter Kommunikationsbedarf^^
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: CPU-Auslastung auf 100%

Beitrag von Krishty »

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?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
hagbard
Beiträge: 66
Registriert: 05.08.2010, 23:54

Re: CPU-Auslastung auf 100%

Beitrag von hagbard »

Schlafen ist doof idealerweise wartest du besser auf eine Condition/Event (WaitFor SingleObject() bzw. boost::timed_wait sind hier die Stichworte).
joggel

Re: CPU-Auslastung auf 100%

Beitrag von joggel »

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...
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: CPU-Auslastung auf 100%

Beitrag von Krishty »

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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: CPU-Auslastung auf 100%

Beitrag von joggel »

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... :?:
NytroX
Establishment
Beiträge: 361
Registriert: 03.10.2003, 12:47

Re: CPU-Auslastung auf 100%

Beitrag von NytroX »

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

Code: Alles auswählen

void VSyncOn() {
	glfwSwapInterval(1);
}

void VSyncOff() {
	glfwSwapInterval(0);
}
Wenn ich die Framerate nicht begrenzen will, benutze ich auch gerne am Ende des Frames ein

Code: Alles auswählen

Sleep(0);
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:
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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: CPU-Auslastung auf 100%

Beitrag von Krishty »

joggel hat geschrieben:Nur frage ich mich, wie ich den VSync in meiner Anwendung einstellen kann... :?:
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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
RedGuy
Establishment
Beiträge: 111
Registriert: 17.09.2002, 17:27
Echter Name: Manuel Hofmann
Wohnort: Rottweil
Kontaktdaten:

Re: CPU-Auslastung auf 100%

Beitrag von RedGuy »

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
Antworten