[WinAPI]Nieregularne miganie ekranu przy czyszczeniu
Ostatnio zmodyfikowano 2015-05-10 19:16
bingo009 Temat założony przez niniejszego użytkownika |
[WinAPI]Nieregularne miganie ekranu przy czyszczeniu » 2015-05-09 22:05:59 Witam was serdecznie, mam program w WinAPI który przypomina grę. Mam pętlę główną jak w grze i niej ciągle jest coś rysowane. Wygląda to tak: while( TRUE ) { while( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) ) { TranslateMessage( & msg ); DispatchMessage( & msg ); } if( msg.message == WM_QUIT ) break; if( wizualizacja ) { dwNewTicks = GetTickCount(); if( dwNewTicks - dwTicks >= 100 ) { } ClearScreen( hWnd ); Ellipse( hDC, 200, 10, 200 + promien * 2, 10 + promien * 2 ); DrawObject( hDC, obx, oby ); } }
Ogółem problem mam, że wszystko na ekranie miga. Jest to mocno nieregularne, gdyż nie miga cały czas, a od czasu do czasu i w dodatku na wolniejszym PC miga częściej niż na szybszym. Bez czyszczenia nic nie miga, ale wiadomo, że nie da się robić rysowania obiektów zmieniających swoją pozycję bez czyszczenia. Funkcja czyszcząca ekran jest zrealizowana tak: void ClearScreen( HWND okno ) { HDC screenDC = GetDC( okno ); HBRUSH brush = CreateSolidBrush( RGB( 255, 255, 255 ) ); SelectObject( screenDC, brush ); Rectangle( screenDC, 180, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ) ); DeleteObject( brush ); ReleaseDC( okno, screenDC ); }
Ekran nie jest czyszczony cały, lewa cześć ekranu o szerokosci 180 zostaje nieruszona, jest to zamierzone, bo tam znajduje się panel sterowania programu. Jak jakoś przyspieszyć to rysowanie, by nic nie migało? |
|
Monika90 |
» 2015-05-10 13:02:58 Użyj podwójnego buforowania. Rysuj klatkę animacji do bitmapy która jest w pamięci, a następnie wyświetl całą bitmapę za jednym zamachem na ekranie funkcją BitBlt. W kursie WinAPI na pewno jest to opisane. |
|
bingo009 Temat założony przez niniejszego użytkownika |
» 2015-05-10 19:16:12 Że też nie pomyślałem o podwójnym buforowaniu... Efekt tego, że zazwyczaj grafikę 2D programuje w SFML, a tam jest to automatycznie. Dzięki za radę, oczywiście podwójne buforowanie rozwiązało problem. |
|
« 1 » |