2013-04-21 17 views
5

Widziałem kilka gier konsolowych, w których ekran odświeża się/czyści bez denerwującego mrugania. Próbowałem wielu rozwiązań, oto, co mam teraz:Ekran czyszczenia konsoli Win32 C++ bez migania

while(true) 
{ 
    if(screenChanged) //if something needs to be drawn on new position 
    { 
    COORD coordScreen = { 0, 0 }; 
    DWORD cCharsWritten; 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    DWORD dwConSize; 
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 

    GetConsoleScreenBufferInfo(hConsole, &csbi); 
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y; 
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten); 
    GetConsoleScreenBufferInfo(hConsole, &csbi); 
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten); 
    SetConsoleCursorPosition(hConsole, coordScreen); 
    } 

    ///printf all the time graphics on their right position with SetConsoleCursorPosition 

    Sleep(33.3f); 
} 

Nadal dostaję minimalne mruganie. Ktoś ma jakieś pomysły?

+1

It jest możliwe, że te gry nie są napisane jako aplikacje konsoli systemu Windows, ale jako aplikacja DOS, które używają różnych trybów graficznych i zapisują piksele bezpośrednio w pamięci graficznej. –

+0

@Captain Przeczytaj ponownie pierwsze zdanie. Kod źródłowy nie jest przeznaczony dla "gier konsolowych", które widział, kod źródłowy jest tym, czego próbował. –

+0

@CodyGray Ups;) –

Odpowiedz

4

Powodem tego jest to, że wyświetlacz odświeża się od momentu wyczyszczenia ekranu konsoli i faktycznego narysowania. Zwykle może się to zdarzyć tak szybko, że nigdy go nie widzisz, ale od czasu do czasu robisz to we właściwym czasie i odczuwasz migotanie.

Jedną z świetnych opcji jest utworzenie bufora poza ekranem o takim samym rozmiarze i szerokości jak ekran konsoli, wykonanie całego tekstu i jego aktualizacja, a następnie przesłanie całego bufora na ekran konsoli przy użyciu WriteConsoleOutput. Upewnij się, że bierzesz pod uwagę, że bufor ekranu musi zawierać zarówno tekst, jak i informacje o atrybutach w tym samym formacie co konsola.

BOOL WINAPI WriteConsoleOutput(
    _In_  HANDLE hConsoleOutput, 
    _In_  const CHAR_INFO *lpBuffer, 
    _In_  COORD dwBufferSize, 
    _In_  COORD dwBufferCoord, 
    _Inout_ PSMALL_RECT lpWriteRegion 
); 
+0

Czy to nie jest to, co robi ncurses? – user1255410

+1

Nie jestem pewien, nie patrzyłem na specyficzne elementy WinAPI ncurses –

+4

Powszechnie używanym terminem jest "podwójne buforowanie". Jest to klasyczna metoda eliminowania wyświetlania częściowo renderowanego ekranu, w tym przypadku pustego ekranu. –

Powiązane problemy