C#快速像素渲染

时间:2012-06-14 09:57:56

标签: c# graphics drawing rendering kinect

我正在使用OpenNI开发深度处理(Xbox Kinect,Asus Xtion等)应用程序。

当传感器提供新的深度数据时,我需要一种非常简单快速的Windows窗体绘图方式(30或60 fps,具体取决于分辨率)。

目前我在数据可用时从单独的线程中使双缓冲面板无效,然后在面板的绘制方法中设置位图的像素,产生可预测的糟糕5fps。

System.Drawing.Graphics似乎缺乏设置单个像素的快速方法,除非任何人都可以另外指示。

我确实只需要设置像素颜色,因此如果可能的话,我们希望避免使用第三方高速渲染API,并且理想情况下尽可能使用原生内容。

有人有任何建议吗?

3 个答案:

答案 0 :(得分:5)

如果您正在使用Bitmaps,那么您应该使用LockBits和UnlockBits直接在内存中访问数据。在C#中,您可以通过使用不安全的代码块和指针来获得一些额外的性能。

有关详细信息,请参阅此链接:http://web.archive.org/web/20150227183132/http://bobpowell.net/lockingbits.aspx

答案 1 :(得分:4)

当你每帧替换很多像素并且每秒需要很多帧时,

image.SetPixel()非常慢。

当您使用WriteableBitmap并致电CopyPixels

时,速度会快很多

这样你可以使用多个线程用像素数据填充数组,只需在一次调用中将数组blit到图像。

修改

请注意,WriteableBitmap是一个WPF类。如果您绑定到WinForms,则可能需要创建自己的实现。 WPF/WinForms/GDI interop: converting a WriteableBitmap to a System.Drawing.Image?

答案 2 :(得分:0)

您可以尝试使用我的LINQ image processing library来处理“缓冲区位图”。它使用非常易于访问的语法,但对于大位图非常有效。它在Nuget上可用作项目中的单个文件。

希望有所帮助!