Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.03.2004, 19:23

cpu-auslastung

mal ne frage:

wenn man im mainloop

Quellcode

1
2
3
4
5
6
7
while(true)
{
     if (PeekMessage(&msg, NULL, 0,0, PM_REMOVE))
            DispatchMessage(&msg)


}


auf ein sleep verzichtet hat man immer eine cpu-auslastung von 100%.
schreibt man sleep(1) rein: 0%.
so wenn man aber nun in der schleife nach dem message-shitt
seinen renderzyklus startet und sleep(1) verwendet läuft alles so langsam.
da krieg ich ein problem mit der abspielgeschwindigkeit meiner animationen.


wie macht ihr das? wie hoch ist eure cpu-auslastung? gibts ne andere möglichkeit
als sleep mit der man weniger als 1 ms warten kann? muss ich nach asm
flüchten?
hat überhaupt jemand kapiert was ich will :) ?

2

29.03.2004, 19:36

Ist doch kein Wunder das deine Animation mit sleep auf einmal nicht mehr richtig läuft. Wenn man auch immer nach jedem Frame eine ms Warten muss. Bei 25 Durchläufen in der Sekunde hat man 25 ms extra.

Ganz wegbekommen wirst du das nicht. Soll man bei Animationen Games auch nett. Ich verwende allerdings immer eine Kombination aus PeekMessage und GetMessage. Wenn die Anwendung den Focus verliert wird immer GetMessage verwendet. Sobald die Anwendung dann wieder den Focus hat wieder PeekMessage.

Es gibt bestimmt die ein oder andere Methode wie man das ganze realisieren kann wie du es meinst. Bei einem reinen Video z.B. könnte man einen Timer einsetzen. Vorzugsweise den von Windows. Wenn er denn auch nicht so genau ist. Da Videos immer eine fest FPS Zahl haben kann man so viel Rechenleistung einsparen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

3

29.03.2004, 19:41

1.anwort: ich hab das buch nicht
2. :

also das problem ist das ich keine möglichkeit kenne
exakt genug zu warten. mit Sleep gehts halt nur ms-schrittweise
und das is lame. (im wahrsten sinne des wortes)
ich könnte natürlich auf sleep verzichten, dann sollte es kein
problem sein eine schleife oder ähnliches am ende einzubauen
nur das reduziert die cpu-auslastung null.
ich hab mal asm ausprobiert und nop ein paar(tausend) mal
angehängt nur das bringt auch nix.
die cpu-auslastung reduziert sich nur beim einsatz von sleep.

wie hoch ist denn bei euch die auslastung schaut doch bitte mal nach.
das würde mich schon sehr interessieren

4

29.03.2004, 19:57

nachtrag:

mit D3DPRESENT_INTERVALL_ONE hab ich das problem natürlich nicht.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

5

29.03.2004, 21:21

Erstmal, wenn es ein Spiel ist, warum ist 100% ein Problem? Manche Leute würden bei einem Spiel sagen, unter 100% ist es ein Fehler.

Zweitens, der kleinste Parameter, der bei Sleep Sinnmmacht ist M.E. 0. Sieh mal in die Doku.

3. Eine Millisekunde macht ein Problem?? Wie kann das den passieren?

4. Wie Du sagst, Synchronisieren mit dem Monitor macht Sinn. Ist es eine Fullscreen Applikation?

6

29.03.2004, 21:55

0. 0 bringt leider gar nix.
...
die 100 % kommen ja nur zustande, weil ich in der while-schleife
keine verzögerung eingebaut hab. nicht weil das programm so
immense ansprüche an die cpu stellt.
die 100% kriegst du auch mit ner leeren while-schleife.
da liegt das problem. was soll ich dann ersmal machen
wenn wirklich was zu berechnen ist?
bis jetzt hampelt ja nur ein einzelner low-poly-character
vor schwarzen grund.

....
ist in erster linie ne fullscreen-applikation aber zum testen lass ichs
meistens windowed laufen. macht aber beides keinen unterschied.

7

29.03.2004, 22:06

Die 100% kommen aus einem ganz bestimmten Grund. Es spielt keine Rolle wieviel Code man in eine Endlosschleife packt. Sie wird immer verarbeitet solange sie läuft. Normalerweise wird auch immer GetMessage verwendet. Sie löst ein warten des Programms aus, wenn keine Nachrichten vorliegen. Aber bis alle Nachrichten verarbeitet wurden, brauchen auch diese 100% der CPU leistung.

Da must du dir keine gedanken machen das die Schleife deine gesamten Resourcen frist und dann nichts mehr für dein Game übrig bleibt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

8

29.03.2004, 22:29

Kann es sein dass das Sleep viele male in einem Frame aufgerufen wird? Versuch mal, es vor das SwapBuffers oder an eine andere Stelle, die genau einmal pro Frame aufgerufen wird zu schreiben.

9

29.03.2004, 22:43

eigentlich wird sleep nur einmal aufgerufen, nämlich im anschluss an
Device->Present(NULL, NULL, NULL, NULL);

wenn man die aufrufe der spiel-relevanten funktionen
in den message-loop steckt is getmessage irgendwie nicht die richtige wahl.
sonst würde ja immer nur dann gerendert wenn ne nachticht kommt.
ich hab aber trotzdem getmessage benutzt und die aufrufe
in einen eigenen thread gestopft.


ich gebs an dieser stelle aber mal auf mir darüber dedanken zu machen.
ich stell einfach auf D3DPRESENT_INTERVALL_ONE um, dann is
die cpu-auslastung wieder bei 0 - 4 %

mich würde aber trotzdem noch interessieren wie hoch bei euch die auslastung
ist.

gruß & thx 23h

Werbeanzeige