实时2D渲染到系统内存

时间:2015-08-13 07:48:31

标签: c++ c 2d rendering real-time

通过编写处理系统(非视频)内存中的图像/帧数据的视频滤镜,渲染2D图形,应该是跨平台的(至少 Windows,Linux& OSX )并且工作得非常快,我查看了不同的渲染器,例如CairoAGG和许多其他项目。我不喜欢GPU要求,因此到目前为止我的重点是软件渲染。

令人遗憾的是, Cairo 在复杂的路径上变得非常缓慢。由于缺少优化而需要用户进行大量工作,其他刚刚渲染到窗口的项目或性能不是很重要,因此微小路径段的渐变和产生难看的几何缺陷, AGG 也很慢他们。 Blend2D让我感到好奇,但却花时间成长。

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

推送与GPU相关的所有图形总是值得的,因为便宜的数据传输到&这些天来自视频内存,即使是1080p或更大的图像?

3 个答案:

答案 0 :(得分:1)

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

对于传输带宽,1080p图像是1920×1080像素,帧速率是每秒30帧,像素是4字节(32位)。因此,实时1080p处理所需的总总线带宽为

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

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

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

答案 1 :(得分:1)

OpenCV的替代方案可能是SDL。至少有一个专门讨论streaming video data to the hardware的教程和文档。当然,你必须用glsl重写你的过滤器来获得任何不错的加速度。

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

答案 2 :(得分:0)

您是否尝试过OpenCV

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