我正在使用OpenNI开发深度处理(Xbox Kinect,Asus Xtion等)应用程序。
当传感器提供新的深度数据时,我需要一种非常简单快速的Windows窗体绘图方式(30或60 fps,具体取决于分辨率)。
目前我在数据可用时从单独的线程中使双缓冲面板无效,然后在面板的绘制方法中设置位图的像素,产生可预测的糟糕5fps。
System.Drawing.Graphics似乎缺乏设置单个像素的快速方法,除非任何人都可以另外指示。
我确实只需要设置像素颜色,因此如果可能的话,我们希望避免使用第三方高速渲染API,并且理想情况下尽可能使用原生内容。
有人有任何建议吗?
答案 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上可用作项目中的单个文件。
希望有所帮助!