• De afgelopen dagen zijn er meerdere fora waarop bestaande accounts worden overgenomen door spammers. De gebruikersnamen en wachtwoorden zijn via een hack of een lek via andere sites buitgemaakt. Via have i been pwned? kan je controleren of jouw gegeven ook zijn buitgemaakt. Wijzig bij twijfel jouw wachtwoord of schakel de twee-staps-verificatie in.

[C++ met SDL]

  • Onderwerp starter Smart Small Wolf
  • Startdatum
Status
Niet open voor verdere reacties.
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:
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 :p :
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:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan