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

[WinAPI]Nieregularne miganie ekranu przy czyszczeniu

Ostatnio zmodyfikowano 2015-05-10 19:16
Autor Wiadomość
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:
C/C++
while( TRUE )
{
   
    while( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) )
    {
        TranslateMessage( & msg );
        DispatchMessage( & msg );
    }
   
    if( msg.message == WM_QUIT ) break;
   
    if( wizualizacja ) {
       
        dwNewTicks = GetTickCount(); //Pobranie aktualnego czasu
       
        if( dwNewTicks - dwTicks >= 100 ) {
            //Aktualizacja pozycji
        }
       
        ClearScreen( hWnd );
       
        Ellipse( hDC, 200, 10, 200 + promien * 2, 10 + promien * 2 );
       
        DrawObject( hDC, obx, oby ); //Funkcja rysujaca kwadrat 3x3 zlozony z pikseli za pomocą SetPixel
       
       
    }
   
}

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:

C/C++
void ClearScreen( HWND okno )
{
    //Czyszczenie okna
    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 );
    //Czyszczenie okna - koniec
}

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?
P-131955
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.
P-131986
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.
P-132059
« 1 »
  Strona 1 z 1