4

如何快速绘制像素数组c++

我在stackoverflow上看到过很多这样的问题,
他们都回答了:

  • 使用 gdi (windows)
  • 使用opengl
  • ...

但一定有办法,opengl是怎么做到的!


我正在写一个小光线追踪器,需要
每秒多次绘制每个像素。
opengl 能够做到这一点,平台独立快速,那么如果没有 opengl
,我该如何实现呢?

“没有opengl并不意味着

  • 使用 sdl(慢)
  • 使用这个/那个库

建议平台本机方法或最接近该
方法 的库。

如果有可能(我知道是)我该
怎么做?
平台独立的解决方案是首选

4

2 回答 2

4

在 Linux 上绘制图形必须使用 X11 或 OpenGL。(在不久的将来,Wayland 可能是另一种选择)。在 Linux 中,没有“原生”的图形处理方式,因为 Linux 内核不关心图形 API。它提供了一个接口 (DRM),然后使用该接口在用户空间中实现图形系统。如果您只想在屏幕上显示像素,而不关心窗口,那么您也可以 mmap /dev/fbdev - 但您通常不希望这样,因为没有人希望他的屏幕被他无法移动的某些程序破坏或隐藏。

由于协议开销,无论使用哪个 API,绘制单点都是低效的。

所以X11就是这样。所以最好的办法是使用 MIT-SHM 扩展来改变缓冲区中的像素,然后由 X11 服务器将其整体传输。当然,使用纯 X11 Xlib 函数执行此操作非常麻烦。因此,这就是 SDL 为您提供的有效服务。

另一个选项是 OpenGL。OpenGL 不是库!它是一个系统级 API,让您几乎可以直接访问 GPU。它与 X11 很好地集成在一起。是的,API 是通过正在加载的库提供的,但从技术上讲,该库只是实际驱动程序的“包装器”或“接口”。用 OpenGL 绘制单点是没有意义的。但是您可以将几个点“批量”成一个列表(使用顶点数组),然后处理该列表。所以这个想法是收集两个显示刷新间隔之间的所有输入点,并在一个批次中绘制它们。

平台独立的解决方案是首选。

那你为什么要问原生API 呢?根据定义,不能有独立于平台的原生 API。要么你是本地人,要么你是平台独立的。

在您的特定场景中,我认为 SDL 将是最好的解决方案,因为它为光线追踪器提供了正确的抽象和程序端接口。仅供参考:像 QEmu 这样的虚拟机使用 SDL。

或者您使用 OpenGL,它是一个被广泛支持的真正平台中性 API。

于 2013-07-07T09:24:25.033 回答
3

在 Linux 上绘制图形必须使用 X11 或 OpenGL。

这是绝对错误的!反例:有些平台不运行 X11,但它们显示像素(例如字体)。

边注。OpenGL 通常依赖于 X11(虽然很困难,但可以在没有 X11 的情况下运行 OpenGL)

正如@datenwork 所说,至少有两种其他方法可以绘制像素:

  1. 帧缓冲设备(fbdev),一种与图形硬件接口的抽象。非常古老,由 Martin Schaller 设计,请参阅内核文档。源代码在这里。也见这里。这是最简单的帧缓冲驱动程序
  2. 直接渲染管理器( DRM),一个内核子系统,为用户级应用程序提供 API,以将命令/数据直接发送到 GPU。(似乎与 OpenGL 所做的相似,但 idk!)。源代码在这里。这是一个初始化简单显示管道的DRM 示例。

这两个都是内核的一部分,所以它们比 X11 低级,X11 不是内核的一部分。两者都可以绘制任意像素(例如penguins)。我猜这两者都是平台无关的(如OpenGL)。

有关如何在 Linux 上绘制内容的更多信息,请参阅此内容。

于 2016-12-28T18:00:15.267 回答