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

pętla gry w WinAPI - pochłania 50% procesora gdy okno jest zminimalizowane lub nieaktywne

Ostatnio zmodyfikowano 2013-07-14 10:09
Autor Wiadomość
Savail
Temat założony przez niniejszego użytkownika
pętla gry w WinAPI - pochłania 50% procesora gdy okno jest zminimalizowane lub nieaktywne
» 2013-07-13 22:33:33
Hej,
Tak wygląda główna pętla mojej gry:
C/C++
MSG msg;
ZeroMemory( & msg, sizeof( msg ) );

while( msg.message != WM_QUIT )
{
    if( PeekMessage( & msg, NULL, 0U, 0U, PM_REMOVE ) )
    {
        TranslateMessage( & msg );
        DispatchMessage( & msg );
    }
    else
    {
        if( !Render() ) //wyswietlanie grafy i obliczenia
        {
            MessageBox( NULL, "Failed to render", "Error", MB_OK | MB_ICONEXCLAMATION );
            PostQuitMessage( 0 );
        }
       
    }
}

Nie jestem do końca pewny co się dzieje w PeekMessage(...). Z tego co powszechnie jest wiadome to nie czeka ona na otrzymanie wiadomości przez aplikację, tylko odrazu zwraca true lub false. No i gdy okno gry jest aktywne i ma focusa to wszystko działa poprawnie. CPU na poziomie 5%.
Wydaje mi się, że PeekMessage() w jakiś sposób kontroluje przydzielanie CPU dla aplikacji zgodnie z jej potrzebami w danym momencie. CPU wzrasta jednak do 50% gdy zminimalizuje okno lub gdy stanie się nieaktywne. A po powrocie do gry CPU spada do normalnego poziomu. Mam dwurdzeniowy procesor i pewnie dlatego pochłania 50% a nie 100%. Z resztą prosty program z nieskończoną pętlą while też będzie odrazu pochłaniać 50%. Dlatego nie mam pojęcia czemu gdy używam funkcji PeekMessage() to CPU jest na poziomie 5% a gdy wykasuje całe przetwarzanie wiadomości z pętli gry:
C/C++
MSG msg;
ZeroMemory( & msg, sizeof( msg ) );

while( msg.message != WM_QUIT )
{
    if( !Render() ) //wyswietlanie grafy i obliczenia
    {
        MessageBox( NULL, "Failed to render", "Error", MB_OK | MB_ICONEXCLAMATION );
        PostQuitMessage( 0 );
    }
}
 to CPU cały czas wynosi 50%. Stąd wniosek, że PeekMessage() w jakiś sposób zapobiega wykorzystywaniu max procesora?

Problem w tym jak sprawić by CPU nie rosło po zminimalizowaniu gry lub po utracie focusa? Byłbym wdzięczny za porady.

PS. Użycie funkcji sleep() nie pomoże bo gra posiada tryb multiplayer i ciągłe używanie funkcji sleep doprowadzi do timeouta i disconnecta.
P-87803
Savail
Temat założony przez niniejszego użytkownika
» 2013-07-14 10:09:28
hmm problemem było to, że szybkość działania mojej gry była uzależniona od szybkości renderowania. Karta graficzna zapewne nie mogła znieść tak dużego obciążenia i dlatego sama zatrzymywała program na jakieś małe ilości czasu. A po minimalizacji możliwe, że nie renderuje i stąd nagły wzrost CPU. Rozwiązaniem było dodanie jakiegoś normalnego timera w ten sposób aby szybkość gry nie była już uzależniona od renderowania ale od jakiegoś stałego framerate'a.
P-87826
« 1 »
  Strona 1 z 1