pętla gry w WinAPI - pochłania 50% procesora gdy okno jest zminimalizowane lub nieaktywne
Ostatnio zmodyfikowano 2013-07-14 10:09
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: 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() ) { 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: MSG msg; ZeroMemory( & msg, sizeof( msg ) );
while( msg.message != WM_QUIT ) { if( !Render() ) { 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. |
|
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. |
|
« 1 » |