这听起来像你遇到的主要问题是没有这么多的应用程序的性能密集程度(像固定大小的缓冲区和静态分配之类的东西会有所帮助),但是它的整个内存占用量。控制虚拟化的方法就是控制虚拟化。
延迟加载可以让你在一半的地方:在某些事情需要它之前,你不会真正创建对象。这很好,但用户使用应用程序的时间越长,在UI中访问的对象越多,创建的对象越多,最终应用程序内存不足。
所以你想抛弃用户不再需要的对象。找出用户不需要的对象可能是一个难题,但它也可以像假设用户不需要最近使用的对象那样简单。您使用最近最少使用(LRU)缓存来执行此操作。
这与MVVM模式完全一致。在您的视图类,你让你的属性获取该对象使用这个伪代码:
if object hasn't been loaded
load object
add object to the LRU cache (whether you loaded it or not)
return object
The LRU cache I wrote保持它包含的对象的一个简单的队列。当你将一个对象添加到缓存中时,如果它不在队列中,它将被添加到缓存中,如果它已经在队列中,它将被移到后面。
如果在添加对象时队列处于其容量状态,则它将弹出队列前面的任何内容(这是最近使用的最少的那个),并引发事件DiscardingOldestItem
。
该事件是对象有机会告诉任何可以引用它的任何事物(即它是属性的视图对象),它需要被丢弃(可能通过引发它自己的事件)。视图对象的事件处理程序应该首先引发PropertyChanged
事件。如果在执行此操作时调用属性getter,那么仍然有一个绑定在某处仍在查看该属性,因此它不应该被丢弃。 (另外,由于getter被调用,对象刚刚移动到队列的后面。)否则,它可以被丢弃。
(请注意,如果你在UI中可见比高速缓存可以容纳更多的物品,这个小舞将成为无限循环,你会得到一个堆栈溢出。)
一个更复杂的方法将有当应用程序开始在内存不足时LRU缓存开始丢弃旧项目(它现在使用固定容量)。这是一个直截了当的改变,但是如果你做出这样的改变,上一段中描述的情景就是你需要给予更多思考的东西;一个非常大的对象可能会导致整个用户界面进入kablooey。
你需要某种智能高速缓存方案,它似乎...... – 2010-01-14 22:26:02
C++可能是一个更好的模式。 =) – 2010-01-14 22:34:32
从某种意义上说,如果您的房子有可能着火,最好在水下建造它。 – 2010-01-14 23:35:34