【发布时间】:2013-04-14 09:54:23
【问题描述】:
我见过一些主机游戏,它们的屏幕会自行刷新/清除,而不会出现烦人的闪烁。我已经尝试了很多解决方案,这是我现在得到的:
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);
}
不过,我还是会眨眼。有人有什么想法吗?
【问题讨论】:
-
这些游戏可能不是作为 Windows 控制台应用程序编写的,而是作为使用各种图形模式并将像素直接写入图形内存的 DOS 应用程序。
-
@Captain 重读第一句话。源代码不是他见过的“主机游戏”,源代码是他尝试过的。
-
@NemanjaBoric 是的,100% 绝对有可能。
-
为什么需要清空控制台?这就是闪烁的来源。如果您希望大对象干净地移动,您将需要双缓冲(根据现有答案),例如,使移动的垂直字符线永远不会显示扭结,但其影响通常是最小的。在大多数情况下,您只需在绘制帧之间不清除屏幕即可。
标签: c++ windows winapi console-application