与GDI内存增长WPF(WPF with GDI Memory growth)

2019-10-17 19:37发布

我正在写在WPF(C#)绘出某些类型的分形的应用。 该数据集的3D点并需要表示为单个像素。 用户可以单击并拖动旋转曲线积分的数额不一,但可以说是相当大的(5000000个地块或更多)。 目前,我画上使用图形对象,然后一个WPF图像的源属性设置为位图System.Drawing.Bitmap。 我的问题是,当我反复地重新绘制图像内存消耗稳步攀升。 情节()方法被调用时用户拖动鼠标重复。

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应用程序中显示自定义绘制的图像,并能够如此迅速地做(即一个体面的帧速率)

是否有这样做的WPF框架内更原生的方式? 我应该沟WPF并返回到Windows窗体,我可以更精确地控制的事情?

Answer 1:

解决了。 这个问题是通过使用DeleteObject的清理HBITMAP的情况下得到解决。 请参考WPF CreateBitmapSourceFromHBitmap()内存泄漏的更多细节。



文章来源: WPF with GDI Memory growth