c++ - 在 Linux 上快速高效地绘制像素阵列

标签 c++ linux opengl pixel

How can I draw a pixel array very fast in c++?

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

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

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


我正在写一个小光线追踪器,需要绘制每个像素
每秒多次
opengl 能够做到这一点,平台独立并且快速
那么我怎样才能没有opengl呢?

“没有 opengl”的意思

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

建议平台原生方法
离那个最近的图书馆。

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

最佳答案

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

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

X11 就是这样。所以最好的办法是使用 MIT-SHM 扩展,你可以用它来改变缓冲区中的像素,然后由 X11 服务器将其整体 blit。当然,使用纯 X11 Xlib 函数执行此操作非常麻烦。这就是 SDL 为您有效地很好地包装的内容。

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

platform independent solutions are preferred.

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

在您的特定场景中,我认为 SDL 是最佳解决方案,因为它为光线追踪器提供了恰到好处的抽象和程序端接口(interface)。仅供引用:像 QEmu 这样的虚拟机使用 SDL。

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

关于c++ - 在 Linux 上快速高效地绘制像素阵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17510714/

相关文章:

c++ - 线程化 io_service 时 Boost.Asio 中的异常处理

c++ - Visual C++ 中的异常输出

linux - Bash 脚本,查找命令,使用通配符或正则表达式

opengl - 编写原始 OpenGL 与使用成熟的游戏引擎之间是否存在中间地带?

opengl - 如何在shader中制作波浪扭曲效果?

c++ - C++ 函数模板实例化的链接器错误(模板实例化类的成员函数)

c++ - 将 C++ 代码移植到 MacOS 有哪些建议?

linux - 在两个 IP 地址上设置 dask 分布式调度程序?

linux - Perl gtk2 窗口更新

c++ - 将 truetype 字形转换为 OpenGL 多边形