[SFML 2.1] pożarcie proscesora przez małą appke
Ostatnio zmodyfikowano 2014-07-07 15:42
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 #include <SFML/Graphics.hpp> #include <SFML/Window.hpp>
using namespace std;
int main() { sf::RenderWindow glowne( sf::VideoMode( 800, 600, 32 ), "MyFG_2D" ); sf::Event gora, dol; sf::Event zamkniecie; sf::Texture tx_postac; tx_postac.loadFromFile( "obrazy/dragonball.png" ); sf::Sprite spr_postac; 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() ) { while( glowne.pollEvent( gora ) - glowne.pollEvent( dol ) ) { 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 ) ) { 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; } |
|
Jacob99 |
» 2014-07-07 14:12:27 while( glowne.pollEvent( gora ) - glowne.pollEvent( dol ) ) { 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 ) ) { 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: 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. okno.setFramerateLimit( 60 );
Gdzie 60 to ilość klatek na sekundę. |
|
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ł ;) |
|
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?? |
|
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 :) |
|
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. |
|
« 1 » |