S
Smart Small Wolf
Gast
[hand]
Onder jullie hebben een aantal die met SDL ( Simple DirectMedia Layer ) werken misschien al gemerkt dat soms als je SDL_PollEvent doet in je spel/programma, het CPU gebruik naar 100% gaat ( of toch erg hoog ). Deze handleiding zal ( hopelijk bij jou zoals het bij mij deed ) het CPU verbruik drastisch verminderen.
Hoe komt het dat dit probleem er is?
Wanneer jij SDL_PollEvent in een loop zet ( zie hieronder ), zal SDL elke keer als de loop doorlopen wordt kijken in de event queue of er een event is, dit wordt een enorm aantal keer per seconden gedaan, hoe minder de processor belast wordt door andere programma's, hoe meer hij zal proberen te checken. Resultaat -> 100% CPU gebruik.
Simpel ( en onuitgewerkt ) voorbeeld:
Hoe verminderen we het gebruik?
Er gaat een mogelijkheid op het internet de ronde, dat is op het einde of het begin van de loop het volgende te plaatsen:
Wat ervoor zal zorgen dat het programma theoretisch gezien 10 milliseconden stil ligt voordat het de loop opnieuw laat beginnen, je merkt er misschien niet veel van, maar echt interessant is dat toch niet, zeker niet voor games waar alles steeds ververst moet worden ( ja, door delay te doen stopt HEEL de loop, dus ook alles wat je tekent zal 10 milliseconden moeten wachten ).
Dit is een oplossing die ik vond; je vindt hem misschien ook op het internet, maar ik heb hem in ieder geval op eigen houtje ontdekt
:
Dit zal ervoor zorgen dat SDL kijkt of er iets in de event queue zit, dan tekent, en dan weer eens snel kijkt, al hij dan uiteindelijk ziet dat er iets inzit, zal hij pas de events gaan opslaan en checken.
De bool IsIdle() functie zal checken of er een event is, en dan een boolean teruggeven of dat zo is of niet, de 0 die ik opgeef als SDL_Event * zegt enkel dat ik wil weten of er een event is, maar als er n gevonden wordt, deze niet uit de queue wil verwijderen ( anders verdwijnt de event in het niets ).
Het lijkt of je hetzelfde doet als bij het eerste voorbeeld, maar dat is niet zo, bij het tweede voorbeeld wordt er geen data over de events opgeslagen, en SDL checkt slechts 1 maal elke keer, waarna hij tekent, opnieuw kijkt, en als hij dan iets vindt, zal hij pas gaan zoeken.
Als je dan je processor gebruik gaat bekijken, hoop ik dat dit voor jou helpt, bij mij waren de resultaten in ieder geval de volgende:
Oude methode:
Ik voer geen event uit: 100% CPU gebruik
Ik voer een event uit: 100% CPU gebruik
Nieuwe methode:
Ik voer geen event uit: 2% CPU gebruik
Ik voer een event uit: 12% CPU gebruik
[/hand]
Onder jullie hebben een aantal die met SDL ( Simple DirectMedia Layer ) werken misschien al gemerkt dat soms als je SDL_PollEvent doet in je spel/programma, het CPU gebruik naar 100% gaat ( of toch erg hoog ). Deze handleiding zal ( hopelijk bij jou zoals het bij mij deed ) het CPU verbruik drastisch verminderen.
Hoe komt het dat dit probleem er is?
Wanneer jij SDL_PollEvent in een loop zet ( zie hieronder ), zal SDL elke keer als de loop doorlopen wordt kijken in de event queue of er een event is, dit wordt een enorm aantal keer per seconden gedaan, hoe minder de processor belast wordt door andere programma's, hoe meer hij zal proberen te checken. Resultaat -> 100% CPU gebruik.
Simpel ( en onuitgewerkt ) voorbeeld:
Code:
while(ProgrammaWerkt)
{
if(SDL_PollEvent(&MijnSDL_Event))
{
//Controleer welke events er gebeuren, voer zo nodig code uit...
}
}
Hoe verminderen we het gebruik?
Er gaat een mogelijkheid op het internet de ronde, dat is op het einde of het begin van de loop het volgende te plaatsen:
Code:
SDL_Delay(10);
Wat ervoor zal zorgen dat het programma theoretisch gezien 10 milliseconden stil ligt voordat het de loop opnieuw laat beginnen, je merkt er misschien niet veel van, maar echt interessant is dat toch niet, zeker niet voor games waar alles steeds ververst moet worden ( ja, door delay te doen stopt HEEL de loop, dus ook alles wat je tekent zal 10 milliseconden moeten wachten ).
Dit is een oplossing die ik vond; je vindt hem misschien ook op het internet, maar ik heb hem in ieder geval op eigen houtje ontdekt

Code:
bool IsIdle()
{
return !SDL_PollEvent(0);
}
while(ProgrammaWerkt)
{
while(IsIdle())
{
//Gewone code, zoals objecten tekenen, buffer swappen, etc...
}
while(SDL_PollEvent(&MijnSDL_Event))
{
//Controleer welke events er gebeuren, voer zo nodig code uit...
}
}
Dit zal ervoor zorgen dat SDL kijkt of er iets in de event queue zit, dan tekent, en dan weer eens snel kijkt, al hij dan uiteindelijk ziet dat er iets inzit, zal hij pas de events gaan opslaan en checken.
De bool IsIdle() functie zal checken of er een event is, en dan een boolean teruggeven of dat zo is of niet, de 0 die ik opgeef als SDL_Event * zegt enkel dat ik wil weten of er een event is, maar als er n gevonden wordt, deze niet uit de queue wil verwijderen ( anders verdwijnt de event in het niets ).
Het lijkt of je hetzelfde doet als bij het eerste voorbeeld, maar dat is niet zo, bij het tweede voorbeeld wordt er geen data over de events opgeslagen, en SDL checkt slechts 1 maal elke keer, waarna hij tekent, opnieuw kijkt, en als hij dan iets vindt, zal hij pas gaan zoeken.
Als je dan je processor gebruik gaat bekijken, hoop ik dat dit voor jou helpt, bij mij waren de resultaten in ieder geval de volgende:
Oude methode:
Ik voer geen event uit: 100% CPU gebruik
Ik voer een event uit: 100% CPU gebruik
Nieuwe methode:
Ik voer geen event uit: 2% CPU gebruik
Ik voer een event uit: 12% CPU gebruik
[/hand]
Laatst bewerkt: