• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

100% CPU Auslastung - wie verhindern? (C & SDL)

Drop

Newbie
Hallo,
ich programmiere grad ein Spiel mit C + SDL.
Meine Systemüberwachung zeigt mir, wenn ich es starte an, dass die CPU zu 100 % ausgelastet ist.
Was wahrscheinlich nicht verwunderlich ist, da das Programm in einer while-Schleife auf Input wartet.
Wie kann ich das verhindern? Mit Threads?
 
Also zumindest bei GL-Anwendungen ist es immer so, dass sie 100% belegen, es sei denn, man begrenzt die Framerate.
Versuch einfach mal ein usleep(1) in den Eventloop einzufuegen, oder besser noch:
- ein Thread fuer das Zeichnen
- ein Eventthread, der blockierende Funktionen verwendet
 
OP
Drop

Drop

Newbie
usleep(1) bringt immerhin 4% nicht ausgelastete CPU
Keine Ahnung was ein "Busy waiter" ist.
Wird einfach in der while-Scleife mit einem SDLPollEvent nach Ereignissen nachgefragt.
Dachte es gäbe da vielleicht ein paar Zeilen, die ich einschiebe, damit es so viel CPU Zeit bekomt, wie es benötigt :)
Aber wenns normal ist (und es sind auch keine Performanceeinbrüche bei parallel laufenden Anwendungen bemerkbar), ists okay.
Threads sind für mich ziemliches Neuland, deswegen wenn möglich meiden :)
 

Kurt M

Hacker
Drop schrieb:
Threads sind für mich ziemliches Neuland, deswegen wenn möglich meiden :)

ich würde sagen, nicht meiden sondern lieber Ausprobieren.
Mit Threads kannst du das CPU Problem sehr elegant lösen, auch wenn sie einige Tücken haben, in die man sich erst einarbeiten muss. Aber es lohnt sich !
 

panamajo

Guru
Drop schrieb:
Keine Ahnung was ein "Busy waiter" ist.
Wird einfach in der while-Scleife mit einem SDLPollEvent nach Ereignissen nachgefragt.

"Busy waiter" nennt man es wenn ein Programm welches in einer Schleife auf ein Ereignis wartet und die Abfrage auf diesen Event ständig wiederholt. Unangenehmerweise entsteht dadurch hohe CPU Last, also genau dein Problem.

In SDL Programmierung bin ich nicht drin, aber Kurt M hat Recht. Evtl. bietet SDL ja auch eine einfache Thread Steuerung für sowas, das dürfte ja Sinn & Zweck einer plattformübergreifenden Spieleplattform sein.
 
OP
Drop

Drop

Newbie
Okay danke euch.
Hab mal SDL_WaitEvent ausprobiert, diesselbe CPU Last und Programm unglaublich träge
Naja, werd dann wohl als nächstes Threads in SDL in Angriff nehmen
cu
 
Oben