使用 C 语言编写游戏的小伙伴们想必起初都要遇到这样的问题,在不断清屏输出数据的过程中,控制台中的输出内容会不断地闪屏。出现这个问题的原因是程序对数据处理花掉的时间影响到了数据显示,或许你可以使用局部覆盖更新方法(减少更新数据量)来缓解闪屏,但是这种方法并不适用于所有场合,尤其是更新数据本身就非常大的场合。
本文将讲述解决控制台应用程序输出闪屏的终级解决方法——双缓冲。
问题呈现
下面的代码演示了在高速不断清屏输出数据的过程的闪屏问题,特邀您一试:
不完全解决方案:局部覆盖更新
本例代码将使用两个 Win32 API 函数,GetStdHandle、SetConsoleCursorPosition,
图例
名称
说明
HANDLE GetStdHandle(
_In_ DWORD nStdHandle
);
获取标准设备句柄
nStdHandle 标准设备,可取值:
STD_INPUT_HANDLE (DWORD)-10,输入设备
STD_OUTPUT_HANDLE(DWORD)-11,输出设备STD_ERROR_HANDLE(DWORD)-12,错误设备调用返回:
成功,返回设备句柄(HANDLE);
失败,返回 INVALID_HANDLE_VALUE;
如果没有标准设备,返回 NULL。
BOOL SetConsoleCursorPosition(
_In_ HANDLE hConsoleOutput,
_In_ COORD dwCursorPosition
);