WPF中Image的Source在不停切换的时候占用大量内存如何解决?

问题描述

最近研究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了。

时间: 2025-01-24 01:58:11

WPF中Image的Source在不停切换的时候占用大量内存如何解决?的相关文章

如何在wpf中动态切换controltemplate?

问题描述 如何在wpf中动态切换controltemplate? RT 我想实现一个自定义树形控件,想动态切换controltemplate,比如有多个controltemplate,可以动态加载.这种思路可行吗?如果可行该如何实现呢?谢谢~~ 解决方案 MVVM开发的话,通过Style的Tiggers来做,添加DataTrigger,绑定ViewModel的一个属性,改变属性值就可以达到切换模板的目的了.

[WPF疑难]在WPF中显示动态GIF

在我们寻求帮助的时候,最不愿意听到的答复是:很抱歉,在当前版本的产品中还没有实现该功能... 在WPF中显示动态的GIF图像时便遇到了这样的问题,WPF中强大的Image控件却不支持动态的GIF(其只能显示第一帧).当然,我们可以说WPF强大的动画能力,让我们完全有理由抛弃传统的GIF动画,但如某种情况下如果你觉得使用动态的GIF更合适的话(比如QQ表情,因为GIF是利于保存和传输的),没关系,本篇随笔将帮助你解决这个问题. 1,曾有过的尝试: 我们在实际开发过程中也遇到显示动态GIF的问题.发

MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件

原文  MSDN 杂志:UI 前沿技术 - WPF 中的多点触控操作事件 UI 前沿技术 WPF 中的多点触控操作事件 Charles Petzold 下载代码示例 就在过去几年,多点触控还只是科幻电影中表现未来主义的一种重要手法,现在俨然已经成为主流的用户界面技术. 多点触控显示屏现在成了新型智能手机和 Tablet 计算机的标准显示屏. 此外,它还可能在公共场所的计算机上普及,例如 Microsoft Surface 率先开发的网亭或桌面计算机. 实际存在的唯一不确定因素是多点触控在常规台式

WPF中使用MediaElement控件来进行音视频播放

WPF中可以使用MediaElement控件来进行音视频播放,然后需要做个进度条啥的,但是MediaElement.Position(进度)和MediaElement.NaturalDuration居然都不是依赖属性,简直不能忍! 好吧,首先说说比较传统的做法(winform?) slider用来显示进度以及调整进度,tb1显示当前进度的时间值,tb2显示视频的时长. player_Loaded 事件中使用DispatcherTimer来定时获取当前视频的播放进度, player_MediaOp

wpf-关于WPF中ComBox的问题

问题描述 关于WPF中ComBox的问题 用下拉框做了一个按类别查找,可是取不到里面的文本.在xaml页面怎么写ComBox??在ViewModel.cs呢? 解决方案 在XAML文件中的代码: <Grid x:Name=""LayoutRoot"" Background=""White"" DataContext=""{Binding Source={StaticResource cb}}"

WPF 中实现快捷键(shorcut)的办法

问题描述 各位大虾,请问在WPF中怎么实现类似winform中使用tabindex实现顺序快捷键功能啊?? 解决方案 解决方案二:该回复于2016-02-26 23:17:50被版主删除解决方案三:WPF控件也有TabIndex属性,按顺序设置tab键切换就行了.

GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件

GMap.NET是什么? 来看看它的官方说明:GMap.NET is great and Powerful, Free, cross platform, open source .NET control. Enable use routing, geocoding, directions and maps from Coogle, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac, Yendux, Mapy.cz, Maps.lt, iKart

.NET框架WPF中加载高质量大图慢的性能优化

最近的项目中,遇到一个关于WPF中同时加载多张图片时,内存占用非常高的问题. 问题背景: 在一个ListView中同时加载多张图片,注意:我们需要加载的图片分辨率非常高. 代码: XAML: <Grid>     <Grid.RowDefinitions>         <RowDefinition Height="Auto"/>         <RowDefinition Height="*"/>     <

Wpf中MediaElement循环播放

原文:Wpf中MediaElement循环播放       前一段时间做了一个项目,里面牵涉到媒体文件的循环播放问题,在网上看了好多例子,都是在xaml中添加为MediaElement添加一个TimeLine,不符合我的项目需求,就自己想了一个办法,基本的思路就是在媒体播放完毕后再次Play一下就OK了,废话不多说,首先Show一下我的代码吧:    写一个方法用来动态创建一个MediaElement:这里的ScreenModel是我创建的一个类,大家根据需要可以修改    MediaEleme