Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.1] pożarcie proscesora przez małą appke

Ostatnio zmodyfikowano 2014-07-07 15:42
Autor Wiadomość
Traktorr
Temat założony przez niniejszego użytkownika
[SFML 2.1] pożarcie proscesora przez małą appke
» 2014-07-07 13:54:26
Mam spadek Fps'ów przy tak prostej aplikacji raczej nie możliwe a jednak mój procesor z 20% obciążenia wskakuje aż do 80% sam w to nie wierzę myślę że to jest coś w kodzie źródłowym lecz ciężko coś z pętli głównej wyrzucić pomóżcie plz.
ps 1:tak w ogóle jeżeli coś jest nie tak z tematem to napiszcie
ps 2:przejrzałem kilka tematów i nic nie dało jeszcze nie próbowałem z komendą sleep(tak nawiasem mówiąc wyszukiwarka jest zepsuta :D)

kod źródłowy

C/C++
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>

using namespace std;

int main()
{
   
    sf::RenderWindow glowne( sf::VideoMode( 800, 600, 32 ), "MyFG_2D" ); // okno
   
    sf::Event gora, dol;
    sf::Event zamkniecie;
   
    sf::Texture tx_postac; // {
    tx_postac.loadFromFile( "obrazy/dragonball.png" );
   
    sf::Sprite spr_postac; //   obrazek postaci
    spr_postac.setTexture( tx_postac ); //  }
   
    spr_postac.setScale( 0.5, 0.5 );
   
    void setPosition( float x, float y );
    void move( float offsetX, float offsetY );
   
    spr_postac.setPosition( 300, 400 );
    while( glowne.isOpen() ) // petla glowna gry
    {
       
        while( glowne.pollEvent( gora ) - glowne.pollEvent( dol ) ) //ruch postaci
        {
            if( gora.type == sf::Event::KeyPressed && gora.key.code == sf::Keyboard::W )
            {
                spr_postac.move( 0, - 10 );
            }
            if( dol.type == sf::Event::KeyPressed && gora.key.code == sf::Keyboard::S )
            {
                spr_postac.move( 0, 10 );
            }
        }
       
        if( glowne.pollEvent( zamkniecie ) ) //zamykanie okna
        {
            if( zamkniecie.type == sf::Event::Closed )
            {
                glowne.close();
            }
            if( zamkniecie.type == sf::Event::KeyPressed && zamkniecie.key.code == sf::Keyboard::Escape )
            {
                glowne.close();
            }
        }
        glowne.clear( sf::Color::Black );
       
        glowne.draw( spr_postac );
        glowne.display();
    }
    return 0;
}
P-113412
Jacob99
» 2014-07-07 14:12:27
C/C++
while( glowne.pollEvent( gora ) - glowne.pollEvent( dol ) ) //ruch postaci
{
    if( gora.type == sf::Event::KeyPressed && gora.key.code == sf::Keyboard::W )
    {
        spr_postac.move( 0, - 10 );
    }
    if( dol.type == sf::Event::KeyPressed && gora.key.code == sf::Keyboard::S )
    {
        spr_postac.move( 0, 10 );
    }
}

if( glowne.pollEvent( zamkniecie ) ) //zamykanie okna
{
    if( zamkniecie.type == sf::Event::Closed )
    {
        glowne.close();
    }
    if( zamkniecie.type == sf::Event::KeyPressed && zamkniecie.key.code == sf::Keyboard::Escape )
    {
        glowne.close();
    }
}

A to co?
Zrobiłeś dwie pętle z dziwnymi warunkami, zamiast np. tak:
C/C++
while( okno.isOpen()
{
    sf::Event event;
    while( okno.pollEvent( event ) )
    {
        if( event.type == sf::Event::Close )
        okno.close();
        if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::W )
        sprite.move( 0, - 10 );
        if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::S )
        sprite.move( 0, 10 );
        //...
    }
   
}

To powinno pomóc.
SFML 2.x obsługa zdarzeń

A jeśli jeszcze to nie pomoże to ustaw limit FPS.
C/C++
okno.setFramerateLimit( 60 );
Gdzie 60 to ilość klatek na sekundę.
P-113413
pekfos
» 2014-07-07 14:42:41
(tak nawiasem mówiąc wyszukiwarka jest zepsuta :D)
Wygrałeś nagrodę! Wyszukiwarka nie działa od 24 czerwca i dopiero teraz ktoś zauważył ;)
P-113419
Traktorr
Temat założony przez niniejszego użytkownika
» 2014-07-07 15:26:57
wykasowanie while dużo dało.
czy jeżeli w main będą 2 pętle while to nadal będzie tak działać jak wcześniej??
P-113425
Jacob99
» 2014-07-07 15:31:48
Zależy co będzie w tych pętlach. Bo ty w 2 pętlach obsługiwałeś (albo raczej próbowałeś obsługiwać) komunikaty 1 okna i to w dodatku 3 obiektami sf::Event naraz. A to oznacza, że każde zdarzenie z okna szło do dwóch pętli i trzech eventów, a to chyba nieco za dużo :)
P-113426
Traktorr
Temat założony przez niniejszego użytkownika
» 2014-07-07 15:42:35
uwierz mi ze ten kod źródłowy to przepuściłem ze skrócenia na skrócenie wcześniej było tam while dla W,S,D,A każdy w osobnym while :D Geniusz i dzięki wielkie temacik do zamknięcia.
P-113427
« 1 »
  Strona 1 z 1