WPF с ростом памяти GDI - PullRequest
       14

WPF с ростом памяти GDI

1 голос
/ 09 октября 2009

Я пишу приложение в WPF (C #), которое отображает некоторые типы фракталов. Наборы данных являются трехмерными точками и должны быть представлены в виде отдельных пикселей. Пользователь может щелкнуть и перетащить, чтобы повернуть графики. Количество точек варьируется, но может быть довольно большим (пять миллионов графиков и более). В настоящее время я рисую на System.Drawing.Bitmap, используя объект Graphics, а затем устанавливаю свойство Source для изображения WPF для этого растрового изображения. Проблема у меня заключается в том, что, когда я многократно перерисовываю, потребление памяти изображения неуклонно растет. Метод 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 и иметь возможность делать это быстро (например, приличная частота кадров)

Есть ли более естественный способ сделать это в рамках WPF? Должен ли я отказаться от WPF и вернуться к формам Windows, где я могу более точно контролировать вещи?

1 Ответ

0 голосов
/ 10 октября 2009

решаемая. Проблема была решена с помощью DeleteObject для очистки экземпляра hbitmap. Пожалуйста, обратитесь к WPF CreateBitmapSourceFromHBitmap () утечка памяти для более подробной информации.

...