Win32 C ++控制台清除屏幕不闪烁

我见过一些控制台游戏,屏幕刷新/清除本身没有恼人的闪烁。 我已经尝试了很多解决scheme,下面是我现在得到的:

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

尽pipe如此,我还是有一些微弱的闪烁。 有人有主意吗?

发生这种情况的原因是因为显示屏在清除控制台屏幕和实际绘制屏幕之间刷新。 通常这会发生得如此之快以至于你永远不会看到它,但偶尔你会在适当的时候做,而且会出现闪烁现象。

一个不错的选择是创建一个与控制台屏幕大小和宽度相同的屏幕外缓冲区,执行所有文本输出并在那里更新,然后使用WriteConsoleOutput将整个缓冲区发送到控制台屏幕。 请确保您考虑到屏幕缓冲区必须同时保存文本和属性信息,格式与控制台相同。

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

你想做相当于双缓冲。 使用CreateConsoleScreenBuffer和SetConsoleActiveScreenBuffer API调用,您可以修改屏幕外的缓冲区,然后切换缓冲区,就像我们过去糟糕的时代:)以下是一篇文章,解释如何: http : //msdn.microsoft.com/en-us/库/窗/台式机/ ms685032%28V = vs.85%29.aspx

你寻找双缓冲