多次使用“\33[2J\33[H”后,如何删除屏幕跳过的部分?

How do I delete the skipped part of the screen after I used "\33[2J\33[H" many times?

提问人:FLAK-ZOSO 提问时间:7/8/2022 更新时间:7/8/2022 访问量:73

问:

我正在为 Windows 编写一个终端游戏,刷新速度很慢,所以我在这里寻求帮助。

std::cout << "\33[2J\33[H"; // They told me to write this...
system("cls") // ...instead of this

但是发送该 ASCII 转义序列只会使终端“滚动”,而不会删除任何内容。


假设我有时真的很想删除旧帧:我应该怎么做?


举个例子,他们告诉我......

std::cout << '\n'; // This...
std::cout << std::endl; // ...was faster than this

然后我问缺少什么才能成为等价物,他们告诉我。\nstd::endlstd::flush

所以我的问题是:\33[2J\33[H 等价于 system(“cls”) 缺少什么?

C++ Windows IO 标准输出

评论

1赞 Some programmer dude 7/8/2022
由于您的目标是 Windows,因此我建议您使用特定于 Windows 的控制台功能,而不是尝试使用常见的转义序列和 .std::cout
0赞 FLAK-ZOSO 7/8/2022
我喜欢让它便携的想法,但 Windows 有一种完全不同的获取字符的方式,所以 conio.h 只与 Windows 兼容,而与 Linux/MacOS 兼容的东西与 Windows 不兼容。因此,由于除非我写了大量 #ifdef,否则它不能跨平台,因此我可能会使用 system(“cls”)。我只是好奇地想知道 cls 是否在引擎盖下使用该逃逸序列。
1赞 Some programmer dude 7/8/2022
即使仅针对 Windows,请不要使用 .这增加了很多开销。使用我之前链接到的控制台功能。例如,请参阅此旧答案中的第二个代码片段。或者这个另一个古老的答案system("cls")
0赞 FLAK-ZOSO 7/8/2022
谢谢,我尝试了第一个,它工作正常。我从来没有搞砸过 Windows API,所以这对我非常有用。
1赞 Eljay 7/8/2022
在后台,直接使用 WinAPI,而不是生成 ANSI 转义序列。cls

答: 暂无答案