2

我正在编写一个 XNA 程序,用于显示 Zune 上特定相册中的图片。问题是,如果我从相册中的所有图片加载纹理,程序就会耗尽内存。一旦用户移动到下一张图片,我尝试一张一张地加载并在上一张图片纹理上调用 Dispose。这可行,但是一旦处理后我就无法从上一张图片中取回纹理,因此用户无法在不重新启动程序的情况下查看过去的图片!

4

2 回答 2

1

不要在相册中存储每个项目的纹理句柄。相反,使用一个程序级句柄,您可以在用户浏览相册时根据需要处理和加载该句柄。

于 2009-06-29T16:19:52.670 回答
0

我建议您只处理一次所有数据处理,并存储文件名(因此您只需执行所有层次结构/排序一次)。然后只在需要时加载图片(正是上一篇文章所建议的)。

这个方法的问题是 Content.Load(string) 会加载你的纹理,但是如果你丢失了所有指向纹理的指针,ContentManager 会将纹理保存在内存中,这样如果你再次加载它就会立即加载。有一种方法 Content.Unload() 将删除这些缓存项目,请参阅:

关于此主题的论坛讨论:
http
://forums.xna.com/forums/p/25978/141761.aspx Shawn Hargreaves 对此进行了解释:http:
//blogs.msdn.com/shawnhar/archive/2006/09/06 /743437.aspx

我实现这一点的方法是每次停止使用图片时调用 unload ,或者如果您想要更快的加载(这取决于用户更改图片的频率,如果他们打算快速浏览图片时间是一个坏主意)尝试捕捉内存异常,然后只调用卸载。

于 2009-07-01T07:59:27.483 回答