实时 2D 渲染到系统内存

Real-time 2D rendering to system memory

通过编写处理系统内存(非视频)数据的视频过滤器,渲染 2D 图形,应该是跨平台的(至少 Windows, Linux & OSX) 并且工作非常快,我查看了不同的渲染器,比如 Cairo, AGG 和许多其他项目。我不希望有 GPU 要求,所以到目前为止我的重点是软件渲染。

遗憾的是 Cairo 在复杂的路径和梯度上可能会变得非常慢,并且会通过微小的路径段产生丑陋的几何错误,AGG 也很慢由于缺少需要用户大量工作的优化,其他项目只是渲染到 windows 或性能对他们来说并不重要。 Blend2D让我很好奇,但他需要时间才能成熟。

现在我问我:我是否应该只渲染到 OpenGL 帧缓冲区并通过几何库处理 2D 到 3D 的东西,接受挑战从头开始开发软件渲染器(通过 SIMD 加速,线程化管道等)还是我错过了适合我的图书馆?

由于如今与视频内存之间的廉价数据传输,即使是 1080p 或更大的图像,推动与 GPU 相关的所有图形总是值得的吗?

典型的台式机 CPU 有 4 个处理核心 运行,频率为 2.5GHz。 modern desktop GPU(大约 2010 年)在 1.4GHz 时有 48 到 480 个着色器 运行。因此,就原始处理能力而言,GPU 处理图形的速度比 CPU.

快 7 到 70 倍

关于传输带宽,一张1080p的图片是1920x1080像素,帧率是30帧/秒,一个像素是4字节(32位)。因此实时 1080p 处理所需的总总线带宽为

1920 x 1080 x 30 x 4 = 248 MB/s

一个PCI Express 2.0 x16槽的带宽是8000MB/s。也就是说 CPU 到 GPU 的传输速率不是问题。

所以,回答你的问题:是的,推动与 GPU 相关的所有图形总是值得的,即使是 1080p 或更大的图像。

你试过了吗OpenCV

它为软件和硬件渲染器提供了huge library 高度优化的实时图像处理和渲染功能。

OpenCV 的替代方案可能是 SDL. There is at least a tutorial and documentation that specifically talks about streaming video data to the hardware。当然,您必须在 glsl 中重写您的过滤器才能获得任何体面的加速。

也就是说,听起来您的问题可能更多地受益于 GPU 计算解决方案,例如 OpenCL 或 Cuda。在这种情况下,不涉及渲染,而是将数据发送到 GPU 内核,并在处理后取回。或者可以将它发送到 OpenGL/DirectX(视频内存可以很容易地作为纹理重复使用而不会损失性能)进行渲染。如果您不热衷于超越 OpenGL api,您也可以使用 compute-shader。像传统着色器一样工作,除了它在一个通道中计算,但有一些额外的约束和限制。