不使用桌面环境如何在C++中绘制图形?

4

嗯,这是一个非常奇怪的问题,我不确定该如何表达,但我无法在任何地方找到相关信息,最有可能是因为我没有使用正确的术语。此外,如果涉及操作系统特定的问题,那么我使用的是Debian。

基本上,当您启动旧计算机或现代服务器计算机或类似设备时,它们会引导到终端屏幕。您只需键入内容。如果您想要进行任何图形化操作,通常会下载桌面环境。

但我想知道,如何在没有桌面环境的情况下绘制图形呢?

我记得在MS-DOS上,您可以使用QBASIC来更改屏幕模式,然后可以像那样在屏幕上绘制彩色线条。在C ++中可能更加复杂,但我仍然希望被指引正确的方向。

如果这个问题有点不明确,请原谅,但我真的很想被指引正确的方向。


你可以使用 Allegro 库(http://alleg.sf.net)作为例子,它相当独立于图形环境,并且允许你像答案中提到的那样使用 framebuffer。 - nothrow
5个回答

6
这可以通过使用帧缓冲控制台来完成。然后,您可以使用能够在其中绘图的框架/库。例如,DirectFB。还有一些小型库可用,例如libFB。我认为SDL也可以使用帧缓冲。不过我自己从未尝试过。

然后,如果您需要GUI窗口小部件,则还有Gtk+和Qt的帧缓冲版本的GUI工具包。

还有SVGAlib,它直接与显卡通信,但现在已经过时了。不建议使用。总的来说,您要寻找的是“Linux帧缓冲图形”。这应该会给您一些起点。

要获取帧缓冲控制台,您需要相应地配置内核。通常,您为图形卡启用KMS驱动程序,并启用KMS帧缓冲。如果您的卡没有KMS驱动程序,则可以使用适用于大多数硬件的通用VESA帧缓冲控制台(虽然它只是通用VESA,但速度较慢且未加速)。


通过Linux FrameBuffer将像素绘制到屏幕上,编程Linux Framebuffer,低级别(Linux framebuffer)图形编程教程。 - phuclv

0
通常,在Linux上,“桌面环境”由两部分组成:XWindow样式的图形“库”和一个“窗口管理器”(Gnome、KDE、Xcfe等)。因此,如果我理解您的问题,您只需要设置一个没有窗口管理器的XWindow系统。

0
在 MS-DOS 上,您可以编写软件来写入屏幕,方法是将数据写入由视频控制器共享的 RAM 范围内,或调用 BIOS API。
较新的操作系统(如 Windows)将阻止您执行上述任何一项操作:相反,您需要调用操作系统 API,该 API 再调用特定于操作系统的视频设备驱动程序,最终输出到硬件。

实际上,Linux帧缓冲区可以像DOS时代一样使用。它被映射到内存中,您只需像VGA模式13h一样向其写入即可。 - Nikos C.
顺便提一下,如果我没记错的话,它是从Linux的Amiga版本移植过来的。Amiga没有文本模式,所以它需要一个帧缓冲区。后来,由于这被证明是个好主意,它也被移植到了x86和其他架构上。 - Nikos C.
@NikosC。我尝试在Windows NT上写入INT 14h,并发现操作系统会捕获并将其转换为对串行端口驱动程序的调用(例如serial.sys或安装在该端口的任何NT驱动程序)。也许Linux帧缓冲区也是这样工作的?据我所知,现代视频硬件不一定从CPU可访问的RAM中读取数据? - ChrisW
1
帧缓冲以/dev设备文件的形式呈现。当您将其映射到内存并写入时,内核驱动程序会进行翻译。这就是Unix上/dev文件的一般工作方式;您将所有内容视为普通文件并在其上执行I/O操作。您可以将图像写入/dev/fb0,它们会显示在屏幕上。或者您可以将WAV文件写入/dev/dsp,它们会在声卡上播放。这是一个存在已久的Unix特性。 - Nikos C.

0

据我所知,您正在询问如何直接处理图形硬件。

这取决于硬件。

如果您手头有一台旧PC并想进行实验,则需要相应的旧开发软件,该软件可以在特定操作系统下运行在该硬件上,即在MS-DOS中运行的某些C编译器。您可以在Windows中的“DOS-box”中执行此操作(不是控制台窗口,而是旧PC的仿真)。64位Windows 7不支持DOS框,但有一个免费的替代品叫做DOSbox

然后,如果您选择这条路线,可以在网络上搜索“图形适配器”图形模式等。

基本上,使用旧PC架构和在DOS下运行的程序,您可以使用DOS服务切换图形模式,然后在已知模式的内存地址处访问图形内存。


-1

curses(或ncurses)库是在Unix系统中进行编程的旧方法,尽管现在可能有更好的替代方案...


不,(n)curses是一个终端库。 - Tamás Szelei
同意它不是一个完全功能的图形库,但即使ncurses维基百科页面也说“它是一个用于在终端仿真器下运行的开发“类GUI”应用程序的工具包”。虽然不知道OP想要什么,但我仍然认为curses仍然是对问题的一个合理(但可能不是最好的)答案。 - John3136
OP从来没有提到过GUI,他只是说他想要图形。很抱歉,但我仍然认为在当前状态下这不是一个好的答案。 - Tamás Szelei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接