100% CPU Auslastung beim "Nichtstun"?



  • TGGC schrieb:

    Warum bitte soll während einem Spiel das im Vollbild und Vordergrund läuft, irgendein Programm im Hintergrund ganz schnell reagieren?

    Hat das Prog selbst denn keine Messagepump in einem separaten Thread oder wird das für gewöhnlich im selben Thread wie das Rendering gemacht?

    TGGC schrieb:

    Noch Alles klar?

    Entschuldige die Unwissenheit.
    Aber es gibt deshalb eigentlich keinen Grund gleich patzig zu werden, selbst wenn hier im Kindergarten-Forum gewöhnlich ein weniger respektvoller Umgangston gepflegt wird als anderswo.



  • scrontch schrieb:

    durito schrieb:

    Es ist Effizient. Es geht ja darum, moeglichst viele FPS zu erreichen -> hohe CPU-Auslastung.

    Nee, es geht aber auch noch darum auf User-Eingaben zu reagieren.

    Naja auf User Eingaben wohl kaum. Da hat TGGC recht... aber grundsätzlich auf andere Systemevents sollten die Programme schon reagieren können.

    scrontch schrieb:

    Wenn du dich bezüglich anderer Threads sportlich verhalten willst, füge ein Sleep(1) in die Schleife ein -

    Es reicht eigentlich ein Sleep(0) um die Zeitscheibe zu unterbrechen und anderen Prozessen d ie Gelegenheit zum Rechnen zu geben (solange diese höhere Priorität besitzen)

    scrontch schrieb:

    Dann geht auch die 100% CPU-Last ganz schnell weg,

    Das wiederum wage ich zu bezweifeln...

    scrontch schrieb:

    Ich bin kein Grafik/Game-Programmierer,
    aber sollte es nicht zumindest einen Mechanismus geben der sicherstellt das die FPS nicht höher als die Bildschirmwiederholungsrate (oder eine vernünftige physiologische Konstante, sagen wir 50 FPS) ist?
    Denn sonst wäre das ja nun wirklich verschwendete Rechenzeit.

    Naja, der Punkt ist der, dass jedes Frame - soviel ich weiss - in einem Game eigentlich ne Art von System tick darstellt bei dem was passiert. (So wars zumindest bei der guten alten HL engine)... Es wird also nicht nur ein Bildchen gemalt sondern auch Objekte rumgeschoben, etc.

    -junix



  • scrontch schrieb:

    TGGC schrieb:

    Noch Alles klar?

    Entschuldige die Unwissenheit.
    Aber es gibt deshalb eigentlich keinen Grund gleich patzig zu werden, selbst wenn hier im Kindergarten-Forum gewöhnlich ein weniger respektvoller Umgangston gepflegt wird als anderswo.

    Aber es gibt deshalb eigentlich keinen Grund gleich zu heulen, weil ich mal darauf hinweise, das man mal etwas nachdenken sollte. Dann wird einem schnell klar, das wenn ein Spiel läuft, es unsinnig ist Rechenzeit abgeben zu wollen. Au

    Bye, TGGC \-/



  • Meistens rennt nen Game doch auch nur mit THREAD_PRIORITY_NORMAL - Andere Programme laufen doch trotzdem weiter - Warum noch nen Sleep() einbauen (bei dem man nichtmal weiss wie lange der Thread dann überhaupt schläft...) ?

    Ich glaube bei opengl + vsync-an lässt SwapBuffers() den Thread schlafen, falls nötig...



  • HI

    Also bei Spielen wirds wohl immer bei den 100% bleiben, weil man will alles aus der Maschine rauslocken um maximale leistung zu nutzten um was nettes zu sehen.

    Will man nur eine Garphik anwendung machen, die auch in einen Fenster (beschleunigt)Grafik ausgibt, kann man es natürlich sanfter lösen, indem man das Scene Rendern und Buffer swap in der WM_PAINT, macht. Somit 'spart' man einiges an leistung. Is für 3d Spiele wohl uninteressant, aber Spiele sind auch nicht das einzige Anwendungsfeld von dx und ogl etc..

    Mfg
    Flow



  • geeky schrieb:

    Meistens rennt nen Game doch auch nur mit THREAD_PRIORITY_NORMAL -

    Jo, würd ich sagen.

    geeky schrieb:

    Andere Programme laufen doch trotzdem weiter - Warum noch nen Sleep() einbauen (bei dem man nichtmal weiss wie lange der Thread dann überhaupt schläft...) ?

    Naja, wie gesagt: ICh hätts eingebaut um die Zeitscheibe zu unterbrechen... War aber mehr son hüftschuss...

    -junix



  • scrontch schrieb:

    PS:
    Ich bin kein Grafik/Game-Programmierer,
    aber sollte es nicht zumindest einen Mechanismus geben der sicherstellt das die FPS nicht höher als die Bildschirmwiederholungsrate (oder eine vernünftige physiologische Konstante, sagen wir 50 FPS) ist?
    Denn sonst wäre das ja nun wirklich verschwendete Rechenzeit.

    Jo, das gibt es schon. Der Befehl zum Buffer swappen (zumindest bei glut oder SDL) synchronisiert mit VSync (d.h. die Ausfuehrung des Befehls wird verzoegert). Kann aber ueber Grafikkartentreiber deaktiviert werden.



  • junix schrieb:

    geeky schrieb:

    Andere Programme laufen doch trotzdem weiter - Warum noch nen Sleep() einbauen (bei dem man nichtmal weiss wie lange der Thread dann überhaupt schläft...) ?

    Naja, wie gesagt: ICh hätts eingebaut um die Zeitscheibe zu unterbrechen... War aber mehr son hüftschuss...

    Naja, das war beim Cooperative Multitasking von Win 3.11 auch nötig. Da mußte jede Anwendung selber sehen, daß sie die CPU wieder anderen zur Verfügung stellt. (Was natürlich bei sauschlecht programmierten Progs direkt zu 'nem Komplett-Lockup des Systems führte)

    Aber bei Preemptive Multitasking wie >= Win 95 und Linux hat sich das OS drum zu kümmern, daß jeder Task mal dran kommt. Da würde ich also nicht zuviel dran schrauben wollen.



  • Naja, wenn ich weiss, dass der nächste Logikschritt erst in 4ms kommt, dann schlaf ich schon mal 2ms und lauf den Rest in einer Schleife ab...
    Man muss ja nicht mit Gewalt die Power verheizen und meinen Akku am Notebook verbrauchen. 🤡

    Und vor allem: Wenn man das Spiel minimiert, wird nichts mehr gerendert, und wenn dann die CPU Auslastung minimiert immer noch bei 100% liegt, dann frage ich mich schon ernsthaft, was der Geiz soll.



  • Optimizer schrieb:

    Naja, wenn ich weiss, dass der nächste Logikschritt erst in 4ms kommt, dann schlaf ich schon mal 2ms und lauf den Rest in einer Schleife ab...
    Man muss ja nicht mit Gewalt die Power verheizen und meinen Akku am Notebook verbrauchen. 🤡

    Und vor allem: Wenn man das Spiel minimiert, wird nichts mehr gerendert, und wenn dann die CPU Auslastung minimiert immer noch bei 100% liegt, dann frage ich mich schon ernsthaft, was der Geiz soll.

    Jo, sicherlich.

    Bei Notebook hast Du recht.

    Und tatsächlich ziehen die meisten (!) kommerziellen Spiele auch minimiert noch 100%, stimmt leider. Oder lassen sich erst gar nicht vernünftig minimieren, ohne daß DX oder GL den Windows-Desktop zukleistert und man ohne Reboot oder Abmelden gar nichts mehr zaubern kann... 🙄

    Generell haben viele kommerzielle Spiele immer noch die gleichen Design-Mängel wie früher, vieles was mich nervt, worauf kein Ar5ch achtet:

    • Seit dem Half-Life Patch XY konnte ich alle 5 Maustasten belegen, das ist in vielen aktuellen Titeln immer noch nicht möglich (und ich hab' jetzt eine 8-Tasten-Maus).
    • Die Dinger die diese scheiß InstallShield-Apps benutzen, das, wenn das Setup beendet wird, nochmal mit einem horrenden Windows-Error die erste CD verlangt, um die EXE endgültig zu beenden. (Das Ding mit Wiederholen, Ignorieren, Abbrechen - und egal auf was man klickt, man bekommt es nicht weg, bevor die CD 1 wieder drin ist. Zudem schiebt es sich immer nach vorne! *grml*) Nachdem man dann CD 1 eingelegt hat nur um das Setup - ohne Fehler - zu beenden, braucht man dann wieder CD 3 zum Zocken... OMG!

    Ich merke gerade, ich werde leicht Off-Topic. 😮
    Naja, wollte das nur mal gesagt haben! 😃 😉

    Das Problem mit dem Sleep ist IMHO, daß man das nicht vernünftig granulieren kann, und nicht weiß, ob der Scheduler einem nach 2 ms auch den Thread wieder anwirft...



  • Optimizer schrieb:

    Und vor allem: Wenn man das Spiel minimiert, wird nichts mehr gerendert, und wenn dann die CPU Auslastung minimiert immer noch bei 100% liegt, dann frage ich mich schon ernsthaft, was der Geiz soll.

    Und vor allem habe ich von Vollbild und Vordergrund gesprochen! Wenn mein Spiel minimiert ist, teste ich auch immer nur schnell, ob ich wieder den Fokus hab und lege mich dann nicht 1 ms, nein gleich 100ms lang schlafen. Aber so lang ich den Fokus habe, gibt es keinen Grund Rechenzeit abzugeben, oder kennst du einen? Es wäre erst recht Stromverschwendung beim Laptop, würde das Spiel z.b. nur 10% Rechenzeit verbrauchen, dann geht 90% der Akkuleistung für den Leerlaufthread drauf. Tolle Idee!

    Bye, TGGC \-/



  • TGGC schrieb:

    Es wäre erst recht Stromverschwendung beim Laptop, würde das Spiel z.b. nur 10% Rechenzeit verbrauchen, dann geht 90% der Akkuleistung für den Leerlaufthread drauf. Tolle Idee!

    Nein, Laptops schrauben ihre Leistung / Stromverbrauch je nach Auslastung runter...



  • Und der Lüfter bleibt ruhig. 😉
    Übrigens, ich Sleep immer 2ms weniger als ich noch Zeit hab, deshalb bin ich auch sicher wieder rechtzeitig dran. Zum Glück fressen WC3 und Far Cry nicht 100% wenn sie minimiert sind. 🙂

    @TGGC: Kennst du einen vernünftigen Grund, nicht absolut überflüssige Zeit abzugeben sondern lieber in einer Schleife abzuwarten?



  • Optimizer schrieb:

    Übrigens, ich Sleep immer 2ms weniger als ich noch Zeit hab, deshalb bin ich auch sicher wieder rechtzeitig dran.

    2 ms reichen da??? 😮

    Optimizer schrieb:

    Zum Glück fressen WC3 und Far Cry nicht 100% wenn sie minimiert sind. 🙂

    Dann von mir das Negativbeispiel: Anno 1503 !
    🙄

    Optimizer schrieb:

    @TGGC: Kennst du einen vernünftigen Grund, nicht absolut überflüssige Zeit abzugeben sondern lieber in einer Schleife abzuwarten?

    Je nachdem _muß_ er ja nicht warten, sondern rendert soviel fps wie geht!
    Bei festem Logiktick für Physik etc. natürlich nicht.



  • @Sgt. Nukem:
    Ich würde eher sagen, sie schrauben runter um die Auslastung zu erhöhen. Je höher die Auslastung, um so weniger Verlust. Das diese Automatik bei Spielen versagt, ist klar. Da muss man schon manuell sagen: mach mal halb schnell, ich möchte grad sparen.

    @Optimizer:
    a) du kannst dir da nicht sicher sein
    b) der Idle process würde die Zeit auch bloß in einer Schleife "verwarten"
    c) ich warte nicht, sondern rendere den nächsten Frame
    D.h. deine Methode verschwendet Rechenleistung, meine nicht. Immer noch nicht alles klar?

    Noch ein Positivbeispiel: OSR!

    Bye, TGGC \-/



  • Sgt. Nukem schrieb:

    2 ms reichen da??? 😮

    Eigentlich sogar eine. Läuft butterweich. In der neuen Version dann hab ich nen Framelock bei 100.

    Optimizer schrieb:

    Dann von mir das Negativbeispiel: Anno 1503 !
    🙄

    Anno1503 ist überhaupt eines der technisch schlechtesten Spiele, die ich mir gekauft hab. Genauso wie Battlefield Vietnam (hab ich mir zum Glück nicht gekauft, sondern nur mal ausgeliehen). Und das passt dann schon richtig, dass die 100% fressen.

    Optimizer schrieb:

    Je nachdem _muß_ er ja nicht warten, sondern rendert soviel fps wie geht!
    Bei festem Logiktick für Physik etc. natürlich nicht.

    Genau. Wenn ich mehrmals rendere, hab ich bestenfalls noch eine flüssigere Mausbewegung, aber sonst ändert sich das Bild nicht. Und 100 fps reichen. 😉

    @TGGC:

    a) das kannst du auch nicht, wenn du in ner Endlosschleife rumläufst. Das Betriebssystem kann dir trotzdem die Kontrolle entreißen, so dass du nicht punktgenau wieder startest. Probier es doch einfach mal aus, es funktioniert mit Sleep wunderbar.
    b) aber nicht mit 100% Auslastung
    c) ja, bei einem Spiel, wo du keine festen Logiktics brauchst und die Bewegungen beliebig skalieren kannst, ist das sicherlich sinnvoll.



  • a) will ich ja auch garnicht
    b) Klar, insgesamt wird ehh immer 100% ausgelastet, oder soll die CPU mal eben stillstehen?
    c) Bei welchem Spiel sollte ich denn nicht zwischen 2 Logikticks interpolieren? Und was bringt es, die Zeit abzugeben? Die Rechenzeit nutzt ehh keiner mehr aus.

    Bye, TGGC \-/



  • a) aber ich, da ich feste Logikframes brauche
    b) lass es mich anders umschreiben: Die CPU wird weniger heiss, verbraucht weniger Strom und im Taskmanager geht die Anzeige für die CPU-Auslastung runter. 🙄 Du weisst genau, was ich meine.
    c) Bei jedem Spiel, wo ein Spiel bei gleichen Bedingungen auf jedem Rechner absolut gleich ablaufen muss /rekonstruierbar sein muss (z.B. für Replays).
    Du musst da mal differenzieren zwischen einem Action Spiel wie euer MiniCan, wo ein paar wenige Objekte verwaltet werden und der Server gemütlich für alle Objekte ständig Positionsupdates senden kann
    und
    einem Strategiespiel, wo der Server es sich höchstens noch erlauben kann, User-Inputs zu versenden und alle Clients daraus die selbe Spielsituation konstruieren können müssen.
    Oder eben mal ein Replay abspeichern wie in WC3 mit gerade mal 40kb Größe für eine halbe Stunde Spiel.



  • TGGC schrieb:

    b) der Idle process würde die Zeit auch bloß in einer Schleife "verwarten"

    Knapp daneben... in der Idle-Schleife wird eben die CPU z.B: mit speedStep runtergetaktet, bis die Power wieder gebraucht wird.

    -junix



  • Wie ich sagte, wenn man zum Sparen was runtertakten will, dann funktioniert diese Automatik nicht. Damit die CPU weniger heiss wird, muss eben nicht die Auslastung (also wieviel der vorhandenen Leistung genutzt wird) runter, sondern die Leistung an sich herabgesetzt werden. Die Auslastung ist letztendlich immer 100%.

    Und warum sollte ich nicht zwischen den diskreten Logikschritten Frames interpolieren können? Dadurch läuft doch immer noch alles rekonstruierbar ab. Schalt doch mal bei Quake die Interpolation zwischen den Logikschritten ab, na dann schönes Spielen... W3 macht es sicher auch so, das ruckelt ja auch je nach Rechner mehr oder weniger.

    Bye, TGGC \-/


Anmelden zum Antworten