Я пишу приложение в 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, где я могу более точно контролировать вещи?