在 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。