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

[SFML 3.0.2] Ograniczyć zużycie CPU

Ostatnio zmodyfikowano wczoraj o godz. 20:53
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 3.0.2] Ograniczyć zużycie CPU
» 2025-10-20 16:52:53
Cześć. Wymyśliłem jak optymalizować zużycie CPU. A mianowicie FPS limiter i sprawdzać eventy jak nie ma to continue. No i właśnie próbuję to napisać. Pobranie eventów już mam

C/C++
std::vector < std::optional < sf::Event >> events;

while( window->isOpen() ) {
   
   
events.clear();
   
while( const std::optional event = window->pollEvent() ) {
       
events.push_back( event );
   
}
   
   
if( events.size() == 0 )
       
 continue;
   

teraz potrzebuję je przetworzyć w pętli obsługującej eventy. Jak to zrobić?

C/C++
//handle events
while( const std::optional event = window->pollEvent() ) {
   
   
if( event->is < sf::Event::Closed >() )
       
 window->close();
   
   
toolbar->handleEvent( * event );
   
main_menu->handleEvent( * event );
};
P-183191
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-20 16:57:23
Już mam ale to niestety zwiększyło zużycie CPU :-/ Zwykłe window->pollEvent jest szybsze

moja nieudana optymalizacja:
C/C++
std::vector < std::optional < sf::Event >> events;

while( window->isOpen() ) {
   
   
events.clear();
   
while( const std::optional event = window->pollEvent() ) {
       
events.push_back( event );
   
}
   
   
if( events.size() == 0 )
       
 continue;
   
   
   
// handle events
   
for( auto & event: events ) {
       
if( !event.has_value() )
           
 continue;
       
       
if( event->is < sf::Event::Closed >() )
           
 window->close();
       
       
toolbar->handleEvent( * event );
       
main_menu->handleEvent( * event );
   
};
};


zwykłe pollEvent - bardziej wydajne:
C/C++
while( const std::optional event = window->pollEvent() ) {
   
   
if( event->is < sf::Event::Closed >() )
       
 window->close();
   
   
toolbar->handleEvent( * event );
   
main_menu->handleEvent( * event );
};
P-183192
pekfos
» 2025-10-20 19:55:28
Jak by to miało cokolwiek zmienić?
P-183201
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-20 20:00:19
Jeśli brak eventów to pomija całą logikę programu czyli update, obsługę eventów i rendering.
P-183202
skovv
» 2025-10-20 20:06:23
sfml nie ma jakiejś funkcji do ograniczenia liczby klatek? Coś mi się kojarzy że było coś takiego
P-183203
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-20 20:09:20
nie o to mi chodzi. limiting klatek na sekundę to jedno. a ja chcę pójść o krok dalej i wyłączyć update progamu gdy nie ma eventów.
P-183204
skovv
» 2025-10-20 20:12:08
tylko że zawsze są jakieś eventy :D
P-183205
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-20 20:43:15
Udało się :D Zuzyćie procka 0% ! a dokładnie to 0-8%

C/C++
void handleEvents( std::vector < std::optional < sf::Event >> & events ) {
   
for( auto & event: events ) {
       
if( !event.has_value() )
           
 continue;
       
       
if( event->is < sf::Event::Closed >() )
           
 window->close();
       
       
toolbar->handleEvent( * event );
       
main_menu->handleEvent( * event );
   
}
}
;

C/C++
render();
render(); // druga klatka zeby nie migało (double buffer)
std::vector < std::optional < sf::Event >> events;

while( window->isOpen() ) {
   
   
prevTime = currentTime;
   
currentTime = mainClock.getElapsedTime();
   
   
events.clear();
   
while( const std::optional event = window->pollEvent() ) {
       
events.push_back( event );
   
}
   
   
if( events.empty() ) {
       
window->display();
       
continue;
   
}
   
   
// ... i inne
   
    // handle events
   
handleEvents( events );
   

P-183208
« 1 » 2
  Strona 1 z 2 Następna strona