【问题标题】:Flicker free console updates with virtual terminal sequences使用虚拟终端序列进行无闪烁控制台更新
【发布时间】:2022-09-29 22:27:06
【问题描述】:

在 Windows 的 C# 控制台应用程序中,我正在使用 Windows 控制台 API WriteConsoleOutput(通过 PInvoke)在单个操作中写入整个缓冲区以防止闪烁。这工作正常。

Microsoft recommends 使用虚终端序列与控制台交互。这些序列很棒,因为它们提供了更好的输出,例如颜色等。

但是,据我了解,WriteConsoleOutput 不能与转义序列一起使用(请参阅CHAR_INFO)。

我的问题是,

如何使用虚拟终端序列写入控制台无闪烁?

我想用不同的字符和颜色更新屏幕的不同部分。通过链接很多 Console.Write()Console.SetCursorPosition 来做到这一点将要导致大量闪烁并降低帧率。

写入整个缓冲区的虚拟终端等效于什么?

    标签: terminal console escaping buffer


    【解决方案1】:

    我讨厌回答我自己的问题,但经过几天的实验,我找到了解决方案。

    这个问题的答案:

    写入整个缓冲区的虚拟终端等效于什么?

    空无一人。 不完全是。 我还没有找到任何类似于WriteConsoleOutput 的东西,它呈现了一个任意大小的预填充缓冲区。

    但是虚拟终端有alternate screen buffers的概念,可以通过CreateConsoleScreenBuffer创建,用SetConsoleActiveScreenBuffer切换。

    使用它,我为我的第一个问题想出了一个解决方案:

    如何使用虚拟终端序列写入控制台无闪烁?

    基本上,我所做的是创建一个新缓冲区,然后在切换缓冲区之前使用WriteConsole 将 VT 转义序列写入后台缓冲区。

    我不喜欢这个解决方案的一点是对WriteConsole 的调用。它们会很多(一个一个地写字符/序列),或者在编写长的预转义字符串时它们会很少。

    为了测试闪烁,我创建了一个包含 120 x 30 个字符的字符串,每个字符都有一个256-color。这产生了一个超过 41,000 个字符的字符串,用作WriteConsole 的输入。

    这实际上似乎工作得很好!

    这是迄今为止我找到的最好的解决方案。如果您找到更好的答案,请在这里写下您自己的答案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2011-08-27
      相关资源
      最近更新 更多