WPF/Silverlight应用程序长时间运行后会产生非常多的内存垃圾(内存泄露例外),特别是在经常需要进行Remove操作的粒子、动画、游戏等方面的应用,国外高手们提出的方案我归纳了一下主要有:
1) UIElement控件实例= null
2) 定时调用GC.Collect()
3) 让控件继承Idisposable接口,并实现相应逻辑
这三种方法都有一定的作用,但是实际使用中均往往难以达到预期效果。特别是在Silverlight应用中,目前的Flash/Flex制作的RPG网页游戏都有一个通病:内存不断增加导致运行二、三十分钟后浏览器即进入假死状态,Silverlight如果无法处理好内存的释放,命运或许终究一样。
那么我们是否还有其他更好的方法实现内存垃圾的释放?大家不妨做这么一个测试,以IE浏览器为例,当我们打开一个运行有Silverlight应用程序的页面后,记录下任务管理器中该IEXPLORE.EXE的内存使用量,然后运行一段时间,再记录此时的内存使用量,最后将该页面最小化再还原回来,大家将看到该IEXPLORE.EXE的内存使用量已被完全的释放干净,如同新开的网页一般。这老掉牙的东西已算不上什么技巧,但是却给了我们一条内存彻底释放的思路:既然Silverlight应用程序是镶嵌在网页中的,我们能否通过该方法去释放内存呢?答案是肯定的。
以我的Silverlight游戏引擎Demo为例,刚加载完时内存使用约56M:

然后我刷了80个怪,并将它们全部消灭干净后内存使用量约为

本文探讨了WPF/Silverlight应用程序内存管理问题,尤其是针对内存垃圾的释放。通过模拟浏览器最小化来实现内存释放,提供了一种在Silverlight中通过JavaScript定时触发内存释放的方法。虽然该方法在IE中有效,但在Firefox等其他浏览器中的实现存在问题。作者呼吁寻找更好的解决方案,以应对Silverlight内存管理挑战。
最低0.47元/天 解锁文章
477

被折叠的 条评论
为什么被折叠?



