5

我见过一些控制台游戏,屏幕会自行刷新/清除而不会出现烦人的闪烁。我已经尝试了很多解决方案,这是我现在得到的:

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

尽管如此,我还是得到了一些最小的眨眼。有人有想法么?

4

3 回答 3

5

发生这种情况的原因是,在您清除控制台屏幕和实际绘制到它的时间之间,显示器会刷新。通常这会发生得如此之快,以至于你永远看不到它,但偶尔你会在正确的时间做它并且你会经历闪烁。

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

BOOL WINAPI WriteConsoleOutput(
  _In_     HANDLE hConsoleOutput,
  _In_     const CHAR_INFO *lpBuffer,
  _In_     COORD dwBufferSize,
  _In_     COORD dwBufferCoord,
  _Inout_  PSMALL_RECT lpWriteRegion
);
于 2013-04-21T13:39:34.103 回答
4

你想做相当于双缓冲。使用 CreateConsoleScreenBuffer 和 SetConsoleActiveScreenBuffer api 调用,您可以修改屏幕外缓冲区,然后切换缓冲区,就像我们过去在糟糕的日子里所做的那样 :) 这是一篇解释如何操作的文章:http: //msdn.microsoft.com/en-us/库/windows/桌面/ms685032%28v=vs.85%29.aspx

于 2013-04-22T21:38:10.840 回答
-2

您正在寻找双缓冲

于 2016-08-23T20:27:59.367 回答