[SOLVED]SDL 120% della CPU per due immagini

di il
4 risposte

[SOLVED]SDL 120% della CPU per due immagini

Salve a tutti,

sto seguendo questo tutorial () per imparare ad usare le SDL.

sono arrivato al punto di caricare due immagini. Il codice è esattamente quello del tutorial escluso il nome delle variabili ma quello non conta.

Ho notato che facendo partire il mio programma questo si porta via il 120% della mia CPU stabilmente. Ho attribuito la colpa di questo al ciclo principale che si ripete fino a quando non chiudo il programma:

while(running) {
        while(SDL_PollEvent(&Event)) {
            OnEvent(&Event);
        }

        OnLoop();
        OnRender();
    }
}
volevo sapere quali modi esistono per evitare questa cosa per esempio un metodo per rallentare il ciclo principale o qualcosa del genere.

Sono certo che esistono dei modi per alleggerire il tutto dato che esistono giochi infinitamente più complessi che consumano il 4% della mia CPU, ma non riesco a pensare a quali questi siano.


EDIT: mi sono dimenticato di dire che ho anche provato a mettere il classico usleep(10000) all'interno del ciclo:

while(running) {
	usleep(100000);
        while(SDL_PollEvent(&Event)) {
            OnEvent(&Event);
        }

        OnLoop();
        OnRender();
    }
}
ovviamente però questo rallenta i tempi di reazione del gioco.

4 Risposte

  • Re: [SOLVED]SDL 120% della CPU per due immagini

    Beh ... 100000 è esagerato !

    Usa una

    usleep(10);
  • Re: [SOLVED]SDL 120% della CPU per due immagini

    Si chiama: programmazione per eventi.

    La tua applicazione dorme il 99% del tempo.

    Si sveglia SOLO quando arrivano degli eventi.

    E quando arriva l'evento, parte un thread che lo gestisce.

    Se arrivano decine o centinaia di eventi dello stesso tipo, NON SI USA decine o centinaia di thread, ma:

    1) gli eventi vengono messi in una coda
    2) un thread o un POOL di thread li prendono in carico e li eseguono.

    Non e' facile, ma nemmeno troppo difficile
  • Re: [SOLVED]SDL 120% della CPU per due immagini

    .

    oregon ha scritto:


    Beh ... 100000 è esagerato !

    Usa una

    usleep(10);
    ho usato usleep(10) ma è ancora un consumo incredibile di CPU intorno al 110% allora ho provato ad utilizzare
    std::this_thread::sleep_for(std::chrono::milliseconds(6)); // sei millisecondi per andare a 15 FPS 
    così arrivo a consumare il 98%, ma è comunque moltissimo.

    migliorabile ha scritto:


    Si chiama: programmazione per eventi.

    La tua applicazione dorme il 99% del tempo.

    Si sveglia SOLO quando arrivano degli eventi.

    E quando arriva l'evento, parte un thread che lo gestisce.

    Se arrivano decine o centinaia di eventi dello stesso tipo, NON SI USA decine o centinaia di thread, ma:

    1) gli eventi vengono messi in una coda
    2) un thread o un POOL di thread li prendono in carico e li eseguono.

    Non e' facile, ma nemmeno troppo difficile
    Grazie migliorabile, conosco il metodo della programmazione per eventi in sistemi a più alto livello (Javascript, Java ed anche con le Qt) il problema è che tutti quei linguaggi (framework nel caso delle Qt) creano loro il ciclo di gestione degli eventi. Al contrario le SDL non lo fanno e lo deve fare il programmatore. Ora il mio ciclo voleva essere questo:
    while(running) {
            std::this_thread::sleep_for(std::chrono::milliseconds(6));
            while(SDL_PollEvent(&Event)) {
                OnEvent(&Event);
            }
    
            OnLoop();
            OnRender();
        }
    Il problema è che evidentemente non ho capito come fare un ciclo che sia veramente ad eventi. Infatti il mio ciclo non "dorme" mai esclusi quei 6 milli secondi. Quello che mi servirebbe capire è come fare in modo che un evento svegli il mio programma quando ne ho necessità piuttosto che fare stupidamente polling su SDL_PollEvent finché questo non mi ritorna un valore.
  • Re: [SOLVED]SDL 120% della CPU per due immagini

    Ciao a tutti,

    Scrivo di nuovo per riferire che ho trovato la soluzione al mio problema.
    Esiste un utile funzione delle SDL che non mi facevano vedere nei tutorial, la funzione si chiama SDL_WaitEvent penso che non sia necessario spiegare cosa fa .

    È sufficiente utilizzarla nel seguente modo:
    
    while(running) {
    
            if(!SDL_WaitEvent(&Event)){
                std::cerr << "Error waiting event" << std::endl;
            }
            else{
                OnEvent(&Event);
            }
    
            OnLoop();
            OnRender();
        }
    
    Il programma ora utilizza il 4% della CPU quando non ha nulla da fare il che è più che accettabile.

    So che sono stato io a fare la domanda quindi non ha molto senso riferire la risposta, ma magari qualcuno più avanti riscontrerà il mio stesso problema e forse non dovrà chiederlo.

    Ringrazio comunque Oregon e Migliorabile per aver tentato di aiutarmi.
Devi accedere o registrarti per scrivere nel forum
4 risposte