Warum flimmert die Konsolenanwendung?



  • hallo,
    warum flimmert in konsolenanwendungen code wie z.B. dieser:

    #include <conio.h>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
    	while(!(kbhit()))
    	{
    		cout << "Ruckelnder Text\n";
                      cout << "Ebenfalls Ruckelnder Text\n";
    		Sleep(40);
    		system("CLS");
    	}
    }
    

    Und vor allem was kann man da gegen tun? Zu Dos Zeiten hat man das doch auch irgendwie gemacht.



  • Das "system("cls");" löscht dein Konsolenfenster, bevor der selbe Text wieder geschrieben wird - d.h. für ein paar Millisekunden siehst du dort ein leeres Fenster. Die Lösung des Problems ist ganz einfach - verwende kein cls, sondern überschreibe lieber den vorhandenen Text soweit, wie du es brauchst (mit gotoxy() kannst du über den Monitor laufen).



  • #include <conio.h>
    #include <iostream>
    #include <windows.h>
    
    int main()
    { 
        while(!_kbhit())
        { 
    		std::cout << "Ruckelnder Text" << std::endl;
    		std::cout << "Ebenfalls Ruckelnder Text" << std::endl;
    
            Sleep(40);
    
            system("CLS");
        }
    
    	return 0;
    }
    

    Weil du alle ~40 Millisekunden den Bildschirm mit CLS löscht.

    MfG



  • mmh danke. Irgendwie hab ich da nicht dran gedacht, das es eigentlich immer reicht neu zu zeichnen. Ich hatte da im Hintergrund immernoch an Spiele ect. gedacht aber da reicht einfaches neuzeichnen ja auch.
    Oder ruckelt es wenn man jetzt z.B. in einem Spiel ein Hintergrundbild hat, und man praktisch bei jedem schleifendurchlauf einfach das Hintergrundbild draufzeichnet und da dann die Figuren raufmacht?



  • Bilder und Modelle musst du laden und zeichnen. Dies solltest du von einem API übernehmen lassen.
    Schau dir lieber mal ganz genau DirectX (meinetwegen OpenGL) an.

    Klar, man braucht eine Hauptschleife. Bei der Konsole jedoch ist ein "CLS" nicht für eine so schnelle, ständige Wiederholung gedacht. Aber bei DirectX zB. setzt man ein Clear vor jeden Zeichenaufruf, sonst würden die alten Bilder nicht gelöscht werden und es würde ein Wirrwarr entstehen.

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
    {
        ...
    
    	MSG msg = {0}; 
    
    	while(msg.message != WM_QUIT)
    	{
    		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    
            d3dDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 44), 1.0f, 0);
            d3dDev->BeginScene();
    
            // Hier Zeichnen - "d3dDev" ist sozusagen die Grafikkarte.
    
            d3dDev->EndScene();
            d3dDev->Present(NULL, NULL, NULL, NULL);
    
        }
    
    	...
    
    	return 0;
    }
    

    MfG



  • Und bei Spielen verwendet man häufig sog. Double-Buffering: Du hast einen Speicherblock, in den du den späteren Bildschirminhalt reinzeichnest (da der nicht sichtbar ist, siehst du auch das "Flackern" dort nicht) - und wenn du fertig bist, wird der komplette Block in dein Anzeigefenster übertragen (das klappt ohne Flackern).



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten