2009-10-09 5 views
0

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

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 и вернуться к формам окон, где я могу более точно контролировать ситуацию?

ответ

0

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

Смежные вопросы