2013-04-21 13 views
5

Ho visto alcuni giochi di console in cui lo schermo si aggiorna/si cancella senza il fastidioso lampeggiamento. Ho provato numerose soluzioni, ecco quello che ho ottenuto fin d'ora:Schermata di cancellazione della console Win32 C++ senza lampeggiare

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); 
} 

Eppure, sto diventando un po 'lampeggiante minima. Qualcuno ha qualche idea?

+1

E ' è possibile che questi giochi non siano scritti come applicazioni per console Windows, ma come applicazioni DOS che utilizzano varie modalità grafiche e scrivono pixel direttamente nella memoria grafica. –

+0

@Captain Rileggi la prima frase. Il codice sorgente non è per i "giochi da console" che ha visto, il codice sorgente è ciò che ha provato. –

+0

@CodyGray Oops;) –

risposta

4

Il motivo per cui ciò accade è perché il display si aggiorna tra il momento in cui si cancella lo schermo della console e si disegna effettivamente su di esso. Di solito questo può accadere così velocemente che non lo si vede mai, ma una volta ogni tanto lo si fa al momento giusto e si verifica uno sfarfallio.

Un'ottima opzione è quella di creare un buffer fuori schermo delle stesse dimensioni e larghezza dello schermo della console, eseguire tutto il lavoro di stampa e aggiornamento, quindi inviare l'intero buffer allo schermo della console utilizzando WriteConsoleOutput. Assicurati di tenere in considerazione che il buffer dello schermo deve contenere sia il testo che le informazioni sugli attributi, lo stesso formato della console.

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

Non è quello che fa ncurses? – user1255410

+1

Non sono sicuro, non ho guardato i pezzi specifici di Win16I di ncurses –

+4

Il termine comune per questo è "doppio buffering". È un metodo classico per eliminare la visualizzazione di uno schermo parzialmente renderizzato, in questo caso uno schermo vuoto. –

Problemi correlati