问题描述
最近研究DrawingVisual,用RenderTargetBitmap进行Bitmap的渲染然后给Image.Source,发现在运行的时候内存无限膨胀,不会自动GC,如果在代码中加入GC则能收集大量内存,请问这个如何解决?代码如下:publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();Loaded+=MainWindow_Loaded;dv=newDrawingVisual();img=newRenderTargetBitmap(600,319,128,96,PixelFormats.Pbgra32);}privateDrawingVisualdv;privateRenderTargetBitmapimg;privatePointcurrPoint=newPoint(0,0);privateMemoryStreamms=newMemoryStream();privatevoidMainWindow_Loaded(objectsender,RoutedEventArgse){vardt=newDispatcherTimer(){Interval=TimeSpan.FromMilliseconds(50)};dt.Tick+=Dt_Tick;dt.Start();//加入守护进程进行GC//vardtgc=newTimer(10000);//dtgc.Elapsed+=(o,args)=>GC.Collect();//dtgc.Start();}privatevoidDt_Tick(objectsender,EventArgse){varnextPoint=newPoint(currPoint.X+1,next());using(vardc=dv.RenderOpen()){dc.DrawLine(newPen(Brushes.Brown,1),currPoint,nextPoint);}currPoint=nextPoint;img.Render(dv);image.Source=img;}privateintnext(){return(newRandom(DateTime.Now.Millisecond)).Next(30);}}
解决方案
解决方案二:
50毫秒切换一次,这也太快了!!你需要再一个地方将image.Source赋值为null
解决方案三:
引用1楼duanzi_peng的回复:
50毫秒切换一次,这也太快了!!你需要再一个地方将image.Source赋值为null
我在赋新值前把source赋值为null了,但是没有任何效果,内存还是无限增长。。。请问如果要做一个连续绘制曲线的坐标系应该如何做呢?就是类似效果的
解决方案四:
这个平台有一系列的绘图工具,比如Path、Line、Polyline等等。如果你那么喜欢在图片上画点,那么其实就没有必要使用wpf了。