摘要: 在 Windows 中使用 C 语言制作控制台小游戏可用的控制台双缓冲技术,此技术可以防止画面刷新时屏幕闪烁的现象,使画面过渡较为流畅。
参考样例文件见 https://github.com/Asura336/BufferCanvas
在使用 C 语言制作控制台小游戏时,为了在画面更新的时候刷新显示内容,一个容易想到的方法是在每一帧刷新画面,Windows 下可以使用控制台命令刷新画面,形如:
// 分配一块内存当作二维数组,存储屏幕显示的信息
char** new_screen(int screen_width, int screen_height)
{
char** screen = (char**)calloc(screen_height, sizeof(char*));
for (int i = 0; i < screen_width; i++)
screen[i] = (char*)calloc(screen_width, sizeof(char));
return screen;
}
// ...
int main(void)
{
int screen_width = 80, screen_height = 80;
char** screen = new_screen(screen_width, screen_height);
// 你在这之前做了点什么,比如初始化工作
while(true)
{
// 你在这之前又做了点什么,比如为 screen 填进了每一帧的内容
system("cls");
}
// ...
}
在上述例子中使用 cls 命令清屏,而这将造成严重的屏幕闪烁。通过移动光标位置局部擦除写入的方式可以一部分改善这个问题,但如果需要重绘的部分过多,这个办法依然不好用。
使用双缓冲方法虽然不会一劳永逸地解决闪屏,但多半能一劳很久逸。所谓双缓冲即是为控制台显示增加一块缓冲区域,每一帧的显示在缓冲区域进行,写入完成后直接放到在活动的控制台显示区域。现代计算机处理数据的速度已经很快,相对而言慢的部分在输出文字到显示器这一步,所以在每一帧将字符放置到缓冲区域再一起显示完全来得及