gpt4 book ai didi

c - 有没有办法使用低电平输出来输出 ANSI 转义序列?

转载 作者:行者123 更新时间:2023-11-30 16:19:41 25 4
gpt4 key购买 nike

我正在尝试在控制台中制作一个图形引擎。我没有使用任何 GL,但希望很快就能开始使用。它是用C编写的,就目前而言,它能够构建彩色的半3D环境,但我发现win cmd支持真彩色方案,使用ANSI转义序列。

通过我对这个主题的研究,我发现了 WriteFile(),Win10 中的所有 printfs 和 putcs 都基于它。但对于它不提供的所有商品,它仍然很慢。正如内部代码所示,writefile 本质上是基于以下代码:

NtWriteFile:

mov r10,rcx
mov eax,8
test byte ptr [7FFE0308h],1
jne NtWriteFile+15h (07FFBA80CAAA5h)
syscall
ret

这很好,但是速度慢且效率低。我的意思是:我将控制台的输出句柄传递给 WriteFile()和缓冲区,但对于 160*60 的屏幕(考虑到每个字符都有自己的 ESC[48;2;r;g;bm,长度为 20 个字节),我们得到 192000 字节。系统调用的执行时间为84ms

然后我返回到之前的设置 WriteConsoleOutputW() 。它使用与控制台相同的输出ptr,但是这次用于320*84的缓冲区(它使用CHAR_INFO ptr作为缓冲区,因此每个4字节)-107 520字节它只持续1 毫秒!

WriteConsoleOutputW() 基于类似的系统调用代码:

NtDeviceIoControlFile:

mov r10,rcx
mov eax,7 ; notice here is the 7 instead of 8
test byte ptr [7FFE0308h],1
jne NtDeviceIoControlFile+15h (07FFBA80CAAA5h)
syscall
ret

但这一次它输出大致相似数量的信息,速度快了 80 倍!我的假设是,它只是重新分配指向控制台缓冲区的指针,因为当我使用单个字符的缓冲区启动它时,它会输出一些带有颜色的奇怪符号

我尝试将 ESC 序列输出为 CHAR_INFO,但它将它们输出为文本。所以问题是:我可以使用 WriteConsoleOutput 或 NtDeviceIoControlFile() 以某种方式输出转义序列吗?

此外:我的帧缓冲区将仅包含转义序列和其后的空格符号。定义了缓冲区的宽度和高度以及矩形,我需要做的就是在每个空间上输出正确的前景色。(因此长度将为20 *高度*宽度)

最佳答案

CMD 是 VT100 模拟器(该信息来自 Telnet 服务器应用程序帮助)。

我不明白你为什么一直谈论 ANSI 和没有特性的函数。

除最新版本的 Windows 10 外,不支持 ANSI。

不使用 ANSI 的人使用 SetConsoleTextAttribute (这意味着颜色)。还有其他移动光标的功能。

    Dim hOut as IntPtr
Dim Ret as Integer
hOut = GetStdHandle(STD_OUTPUT_HANDLE)
Ret = SetConsoleTextAttribute(hOut, &hfA)
Console.Out.Write("*")
Ret = SetConsoleTextAttribute(hOut, &hfC)
Console.Out.Write("WARNING")
Ret = SetConsoleTextAttribute(hOut, &hfA)
Console.Out.Write("*" & vbcrlf)

要移动光标,请使用

Pos.X = CInt(Xpos)
Pos.Y= CInt(Ypos)
Ret = SetConsoleCursorPosition(hOut, Pos)

writefile 的行为(有三种写入方式)由 SetConsoleMode 控制(也可以打开 ANSI)。请参阅https://learn.microsoft.com/en-us/windows/console/setconsolemode .

两种高级模式是writefilewriteconsole。低级别是writeconsoleoutputcharacter

关于c - 有没有办法使用低电平输出来输出 ANSI 转义序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55560959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com