2016-04-18 51 views
0

什么是用C#中的新数据重新绘制图像的最有效内存方式?C#高效地用新数据重新绘制图像

我使用的外部DLL分配一个字节缓冲区来保存我的(宽*高* bytePerPixel)像素数据,其中每个像素都是ARGB32格式。 DLL通过与硬件交互来自动更新该缓冲区,然后调用一个C#回调函数说明新数据已准备就绪。现在,我的显示新数据的方案是

var bmp = new Bitmap(_size.Width, _size.Height, PixelFormat.Format32bppArgb); 
var bitmapData = bmp.LockBits(
       new Rectangle(new Point(0, 0), _size), 
       ImageLockMode.UserInputBuffer | ImageLockMode.WriteOnly, 
       PixelFormat.Format32bppArgb, 
       unmanagedByteDataPtr); 
bmp.UnlockBits(bitmapData); 
myGui.ImageCtrl.Image = bmp; 

这会创建一个新的位图,每次都有一个内存/性能损失。由于我的图像大小没有变化,是否有更有效的方法来做到这一点?

回答

1

您正在使用错误的构造函数。只需直接从非托管的数据创建位图,它会包裹的数据,而不是创建一个新的位图只是为了走马上扔掉它:

new Bitmap(_size.Width, _size.Height, 4 * _size.Width, PixelFormat.Format32bppArgb, 
      unmanagedByteDataPtr); 
+0

感谢您的建议。我尝试了这一点,但它似乎并没有提高CPU而不是内存利用率。这个建议是不是每次都会创建一个新的位图对象?据我所知,这两种方法只是简单地引用实际的非托管像素数据作为缓冲区。所以,这导致我相信内存/ CPU使用率来自于我在每一帧上创建和处理位图对象的事实。 –

+1

@PaulGrinberg你有没有使用过探查器? 'Bitmap'对象本身没有数据,它只是一个GDI +位图的包装,它只是引用你的内存位置,而不是复制它。也许你的问题只是在别的地方? – Luaan

+0

感谢您的建议。在意识到我的问题不是位图创建之后,我开始寻找其他地方的内存泄漏并找到它。 –