我正在编写一个XNA程序,用于显示Zune上特定图片集的图片。问题是当我从相册中的所有图片加载纹理时,程序内存不足。我尝试逐个加载并在用户移动到下一张图片后调用上一个图片纹理上的Dispose。这可以工作,但是一旦它被丢弃,我就无法从上一张图片中取回纹理,因此用户无法在不重新启动程序的情况下查看过去的图片!
答案 0 :(得分:1)
不要在相册中按项目存储纹理处理。相反,使用单个程序级句柄,在用户浏览相册时根据需要进行处理和加载。
答案 1 :(得分: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
我实现这一点的方法是每次停止使用图片时调用卸载,或者如果你想要更快的加载(这取决于用户更改图片的频率,如果他们想要快速浏览图片)每次快速卸载都是一个坏主意)尝试赶上内存异常,然后只调用卸载。