Noch kürzer Warten als Sleep(1)
-
Die Schlafe Funktion ist nicht von mir, nur um das mal klar zu stellen. Von mir ist lediglich die Stoppuhr Klasse, welche intern die Performance Counter benutzt.
Hab ich auch nie gesagt.
cm ist keine Klasse, sondern lediglich eine Instanz dieser.
Ich wusste schon das cm keine Klasse ist aber ich kannte das Wort Instanz noch nicht und wusste nich was ich sagen sollte.
Ich glaube du gehst die Sache falsch an. Was programmierst du, ein Spiel?
Ja
Dafür brauchst du imo keine Schlafe Funktion. Entweder du nutzt die CPU Zeit sinnvoll, um Input, Grafik und Logik zu verarbeiten. Oder du gibst verfügbare Zeit an andere Threads ab, mit zB Sleep(0) oder WaitMessage(), je nachdem wie deine Hauptschleife aufgebaut ist.
Die Hauptschleife ist so aufgebaut:
while(aktiv)
{
// Zeichne, rechne,...
Schlafe(70-Zeit die das rechnen und co brauchte);
}Übrigens, das Problem mit der 100% Auslastung kannst du umgehen, wenn du in deine Schlafe Schleife (was für ein Ausdruck
) ein Sleep(0) einbaust. Sleep(0) bewirkt kein "schlafen", sondern verwirft den time slice für den aktuellen Thread und springt zum nächsten Thread. Aber wie gesagt, ich empfinde eine Schlafe Funktion in diesem Zusammenhang nicht als sinnvoll..
Wenn ich bei mir Sleep(0) in die Schlafe Schleife einbaue hab ich immer noch 100% CPU auslastung. bei Sleep(1) Wird alles wieda ungenau.
Darüber hinaus bedeutet so eine Vorgehensweise noch lange nicht, dass Schlafe genauer arbeitet als Sleep
Das ist sie bei mir auf jeden Fall.
-
joomoo schrieb:
Die Schlafe Funktion ist nicht von mir, nur um das mal klar zu stellen. Von mir ist lediglich die Stoppuhr Klasse, welche intern die Performance Counter benutzt.
Hab ich auch nie gesagt.
Das war auch nicht an dich gerichtet. Schau dir nochmal das Zitat an, dann siehst du wen ich gemeint hab.
joomoo schrieb:
Die Hauptschleife ist so aufgebaut:
while(aktiv)
{
// Zeichne, rechne,...
Schlafe(70-Zeit die das rechnen und co brauchte);
}Genau das versteh ich nicht. Was willst du mit Schlafe? Lass es doch einfach weg. Eine simple Hauptschleife könnte so aussehen
while (aktiv) { input(); logik(); render(); }
input und render (Grafik, Sound) lässt du einfach immer bearbeiten. logik sieht dann zB so aus (Bsp für ein Objekt)
void logik() { //.... // Objekt alle 0,5 Sekunden bewegen if (cm1.elapsed_milliseconds() >= 500) { bewege_objekt(); cm1.reset(); } //.... }
Die Geschwindigkeit über eine Framebremse zu steuern ist jedenfalls keine gute Idee.
joomoo schrieb:
Wenn ich bei mir Sleep(0) in die Schlafe Schleife einbaue hab ich immer noch 100% CPU auslastung. bei Sleep(1) Wird alles wieda ungenau.
Ja, sorry. Hab mich vielleicht etwas ungenau ausgedrückt. Wenn dein Programm halt voll arbeitet, dann hat es halt auch 100% Auslastung. Das ist nicht ungewöhnlich. Sleep(0) soll ja nur dafür sorgen, dass andere Programme bei Bedarf nicht unnötig geblockt werden.
joomoo schrieb:
Darüber hinaus bedeutet so eine Vorgehensweise noch lange nicht, dass Schlafe genauer arbeitet als Sleep
Das ist sie bei mir auf jeden Fall.
Tja, da hast du wohl Glück gehabt.
-
Mit deiner Lösung hab ich dann aber immer noch 100% CPU-Auslastung.
-
Ich sagte doch schon, dass das nicht ungewöhnlich für Spiele ist. Der Application Loop arbeitet dort nunmal etwas anders als bei "normalen" Programmen. 100% Auslastung bedeutet ja noch lange nicht, dass deine CPU überfordert ist. In diesem Fall heisst das einfach nur, dass die kompletten CPU Ressourcen deiner Anwendung zugute kommen und nicht im Leerlauf verharren.
Wenn deine Anwendung nicht aktiv ist und du immer noch 100% Auslastung hast, dann ist deine Hauptschleife definitiv falsch aufgebaut. Nur mal so als Beispielwhile (aktiv) { if (!stopped) { input(); logik(); render(); } else { WaitMessage(); } }
stopped wird je nachdem ob deine Anwendung aktiv oder nicht aktiv ist gesteuert. Das kannst du zB über WM_ACTIVATE (iirc) machen.
-
groovemaster schrieb:
Ich sagte doch schon, dass das nicht ungewöhnlich für Spiele ist. Der Application Loop arbeitet dort nunmal etwas anders als bei "normalen" Programmen. 100% Auslastung bedeutet ja noch lange nicht, dass deine CPU überfordert ist. In diesem Fall heisst das einfach nur, dass die kompletten CPU Ressourcen deiner Anwendung zugute kommen und nicht im Leerlauf verharren.
Wenn deine Anwendung nicht aktiv ist und du immer noch 100% Auslastung hast, dann ist deine Hauptschleife definitiv falsch aufgebaut. Nur mal so als Beispielwhile (aktiv) { if (!stopped) { input(); logik(); render(); } else { WaitMessage(); } }
stopped wird je nachdem ob deine Anwendung aktiv oder nicht aktiv ist gesteuert. Das kannst du zB über WM_ACTIVATE (iirc) machen.
Jedes Spiel, das die ganze Zeit 100% CPU-Auslastung hat, könnte ich in die Tonne treten, weil alle unsere PCs im Haus eine Temperaturlüftersteuerung haben. Bei unserem Notebook ist das unerträglich.
Sag mir mal ein Spiel was permanent 100% CPU-Auslastung hat? Ich kenn kaum welche. Ich will das auf jeden Fall wegkriegen, und das muss doch möglich sein, oder?
-
Öhm, bei mir erzeugen fast alle Spiele 100% CPU-Auslastung (sofern sie nicht gerade inaktiv - sprich minimiert sind oder nen anderes Fenster im Vordergrund ist...)
-
joomoo schrieb:
Sag mir mal ein Spiel was permanent 100% CPU-Auslastung hat?
Call of Duty, Doom III, World War II Online, Medal of Honor: Allied Assault... generell gesagt: Jedes Spiel zieht 100% CPU, da Multitasking und ein Fullscreen 3D-Spiel nicht zusammenpassen (außerdem: Was willst Du nebenher noch tun, wenn Du spielst? Nach Viren scannen? Festplatte defragmentieren?)
-
Dir ist aber klar das dein Spiel sich in eine ständig abarbeitene Schleife befindet und nicht ruht, daher zu 100% arbeitet und nicht still liegt bis Windows eine Wndproc deines progs aufruft?
Ich sage mal so, wenn es keine 100% wären, dann sollte man sich gedanken machen.
-
joomoo schrieb:
Jedes Spiel, das die ganze Zeit 100% CPU-Auslastung hat, könnte ich in die Tonne treten
Dann kennst du wohl nicht allzu viele?
joomoo schrieb:
weil alle unsere PCs im Haus eine Temperaturlüftersteuerung haben
Na und? Was hat das eine mit dem anderen zu tun? Wenn eure Lüfter zu laut werden, dann ist eure Hardware ungeeignet und nicht die Software.
joomoo schrieb:
Sag mir mal ein Spiel was permanent 100% CPU-Auslastung hat? Ich kenn kaum welche. Ich will das auf jeden Fall wegkriegen, und das muss doch möglich sein, oder?
Wie meine Vorredner und ich bereits erwähnten, sind 100% Auslastung für Spiele Normalität. Wenn's dir totzdem nicht passt, dann bau dir 'ne Framebremse in die Hauptschleife.
-
groovemaster schrieb:
joomoo schrieb:
Jedes Spiel, das die ganze Zeit 100% CPU-Auslastung hat, könnte ich in die Tonne treten
Dann kennst du wohl nicht allzu viele?
Ne, ich weiß es eigentlich nur von Spiele vom Laptop, weil da hört man es, und dort gibt es nur ein Spiel/Anwendung die 100% zieht. Aber da sind auch nicht die Spiele hits drauf (SC, w3, tetris, mahjongg, pinnball, clickomanio, w2, ...)
joomoo schrieb:
Sag mir mal ein Spiel was permanent 100% CPU-Auslastung hat? Ich kenn kaum welche. Ich will das auf jeden Fall wegkriegen, und das muss doch möglich sein, oder?
Wie meine Vorredner und ich bereits erwähnten, sind 100% Auslastung für Spiele Normalität. Wenn's dir totzdem nicht passt, dann bau dir 'ne Framebremse in die Hauptschleife.
Hallo? Genau das will ich wissen, wie das geht!
-
joomoo schrieb:
Hallo? Genau das will ich wissen, wie das geht!
Hallo? Genau das wurde Dir bereits zigmal gesagt, ist Dir aber angeblich "nicht exakt genug"!
-
Hepi schrieb:
joomoo schrieb:
Sag mir mal ein Spiel was permanent 100% CPU-Auslastung hat?
Call of Duty, Doom III, World War II Online, Medal of Honor: Allied Assault... generell gesagt: Jedes Spiel zieht 100% CPU, da Multitasking und ein Fullscreen 3D-Spiel nicht zusammenpassen (außerdem: Was willst Du nebenher noch tun, wenn Du spielst? Nach Viren scannen? Festplatte defragmentieren?)
Ja, schon. Oder CD-Image machen, sachen downloaden, cd-brennen, film rippen, etc...
Noch ein paar Spiele OHNE 100% CPU-Auslastung:
StarCraft
WarCraft2
WarCraft3
Soldat
C&C - Generäle
Midtown Madness 2
-
Hepi schrieb:
joomoo schrieb:
Hallo? Genau das will ich wissen, wie das geht!
Hallo? Genau das wurde Dir bereits zigmal gesagt, ist Dir aber angeblich "nicht exakt genug"!
Hallo? Ich will ja nichts sagen, aber diese Methode hat immer noch 100% CPU-Auslastung!
-
Natürlich hat sie das, und weißt Du warum?
Du sagst Windows schließlich: ich WILL 100% CPU haben!!!
Nämlich da:
while(1) { // Action }
Dieser Code hat generell (egal ob Spiel oder nicht) 100% CPU, solange 1 TRUE ist (was es immer ist)...
-
Hepi schrieb:
Natürlich hat sie das, und weißt Du warum?
Du sagst Windows schließlich: ich WILL 100% CPU haben!!!
Nämlich da:
while(1) { // Action }
Dieser Code hat generell (egal ob Spiel oder nicht) 100% CPU, solange 1 TRUE ist (was es immer ist)...
Wenn man für "// Aktion" "Sleep(1);" einsetzt hab ich dann aber keine 100%. Also hat der Code nicht generell 100% CPU-Auslastung. Und wie haben das bitte die Spiele OHNE 100% CPU-Auslastung gemacht, wenn nicht mit ner Schleife?
-
Das Verhalten ist logisch wenn man einerseits sagt "ich will 100% CPU" und dann sofort sagt "ich verzichhte auf CPU für mindestens 1 ms", oder?
-
joomoo schrieb:
Hepi schrieb:
joomoo schrieb:
Sag mir mal ein Spiel was permanent 100% CPU-Auslastung hat?
Call of Duty, Doom III, World War II Online, Medal of Honor: Allied Assault... generell gesagt: Jedes Spiel zieht 100% CPU, da Multitasking und ein Fullscreen 3D-Spiel nicht zusammenpassen (außerdem: Was willst Du nebenher noch tun, wenn Du spielst? Nach Viren scannen? Festplatte defragmentieren?)
Ja, schon. Oder CD-Image machen, sachen downloaden, cd-brennen, film rippen, etc...
Noch ein paar Spiele OHNE 100% CPU-Auslastung:
StarCraft
WarCraft2
WarCraft3
Soldat
C&C - Generäle
Midtown Madness 2Midtown Madness 2 und Soldat haben nur im Menü keinen 100%, und das ist ja klar. Hmmm... Komisch. Ist mir noch nie aufgefallen. Vielleicht ist das wirklich nicht son großes übel... (ich glaube ihr habt recht)
-
Hepi schrieb:
Das Verhalten ist logisch wenn man einerseits sagt "ich will 100% CPU" und dann sofort sagt "ich verzichhte auf CPU für mindestens 1 ms", oder?
Genau. Und ich möchte jetzt wissen wie ich für 1 ms oder weniger auf die CPU verzichten kann.
-
Das ist der Moment an dem ich mich ausklinke.
Lerne, wie Windows arbeitet.
Vielleicht verstehst Du es, wenn Du weißt wie Windows arbeitet.
Momentan hat das mit Dir keinen Sinn (oder andersrum: es hat einen Grund weshalb Spiele 100% CPU ziehen. Oder sind "Götter" wie John Carmack schlichtweg stümperhaft in Deinen Augen?)
-
So langsam verliert der Thread an unwichtigkeit und die Antworter (wie Hepi) erhalten das Gefühl gegen die Wand zu reden. Die 8 Seiten dieses Threads stecken bereits so voller Informationen, das man nur noch sagen brauch: "Ahhh, jetzt ja, Logisch".
Die Auslastung in Prozent wird durch die Tätigkeit in einer bestimmten Zeit erechnet.
Führt ein Programm ständig Code aus (while-Schleife), daher es "Pausiert" nicht, hat es 100%
Übergiebt das Programm wiederum Rechenzeit ans System (Sleep(0)/Sleep(1)), sinckt die Auslastung.
100% Auslastung bedeutet nicht 100% CPU-Leistung, sonder 100% der zugeteilten Leistung.Framebremse und Bewegung nach Zeit wurden auch bereits besprochen, so Denke ich dürfte das Thema nun durch sein, mach das Beste raus.
Die allerletzte Möglichkeit wäre dann nur noch C64
EDIT: Upps, jetzt habe ich 9 Seiten raus gemacht.