我在WPF(C#)中编写了一个应用程序,用于绘制某些类型的分形。数据集是3d点,需要表示为单个像素。用户可以单击并拖动以旋转绘图点的数量会有所不同,但可能会非常大(500万个或更多)。目前,我使用Graphics对象绘制到System.Drawing.Bitmap,然后将WPF Image的Source属性设置为该位图。我的问题是,当我反复重绘图像内存消耗稳步爬升。当用户拖动鼠标时,会重复调用Plot()方法。
public void Plot()
{
Graphics g = Graphics.FromImage(bmpCanvas);
//Draw on the graphics object
//...
//...
//...
g.Dispose();
Canvas.Source = loadBitmap(bmpCanvas);
GC.Collect();
}
private BitmapSource loadBitmap(System.Drawing.Bitmap source)
{
return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(source.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
具体来说,我想知道我能做些什么来防止记忆无法控制地攀爬。
总的来说,我想知道这首先是一个好方法。我想在wpf应用程序中显示自定义绘制的图像,并且能够快速完成(IE。一个不错的帧速率)
在WPF框架内有更原生的方法吗?我应该抛弃WPF并回到Windows窗体,我可以更精确地控制事物吗?
答案 0 :(得分:0)
解决。通过使用DeleteObject清理hbitmap的实例解决了该问题。有关详细信息,请参阅WPF CreateBitmapSourceFromHBitmap() memory leak。