Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Zune XNA中加载图片而不耗尽内存?_Xna_Image_Texture2d_Zune - Fatal编程技术网

如何在Zune XNA中加载图片而不耗尽内存?

如何在Zune XNA中加载图片而不耗尽内存?,xna,image,texture2d,zune,Xna,Image,Texture2d,Zune,我正在写一个XNA程序,在Zune上显示特定相册中的图片。问题是,如果我加载相册中所有图片的纹理,程序的内存就会耗尽。我试着一个接一个地加载,并在用户转到下一张图片时调用上一张图片纹理上的Dispose。这是可行的,但我无法从上一张图片中恢复纹理,因此用户无法在不重新启动程序的情况下查看以前的图片 不要在相册中存储每个项目的纹理句柄。相反,当用户浏览相册时,使用一个程序级句柄,您可以根据需要进行处理和加载。我建议您只需对所有数据处理一次,并存储文件名(因此您只需对所有层次结构/排序进行一次)。然

我正在写一个XNA程序,在Zune上显示特定相册中的图片。问题是,如果我加载相册中所有图片的纹理,程序的内存就会耗尽。我试着一个接一个地加载,并在用户转到下一张图片时调用上一张图片纹理上的Dispose。这是可行的,但我无法从上一张图片中恢复纹理,因此用户无法在不重新启动程序的情况下查看以前的图片

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

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

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

关于此主题的论坛讨论:

肖恩·哈格里夫斯解释道:


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

为什么不使用相同的逻辑重新加载它呢?嗯,有一系列相册,我必须通过它们来检索所有图片,然后我必须在将它们呈现给用户之前对它们进行排序。如果用户每次按下“后退”按钮查看过去的图片时都这样做,那就太疯狂了。肯定有更好的解决办法吗?是的,我就是这么做的。我在任何时候只有一个纹理句柄引用一个图片纹理。但是,一旦从图片访问纹理,即使我为控制柄指定了不同的纹理,纹理也不会消失。它似乎被缓存在某个地方。如果调用纹理上的Dispose,则无法从图片中恢复纹理。每次我调用GetTexture它都会返回null。你能发布一些代码吗?你确定这是纹理的问题吗?也就是说,是不是在加载下一个文件时保持了一个不会被清除的文件锁,然后阻止您重新加载上一个文件?谢谢您的帮助!实际上,我已经更改了代码,因为现在图片必须附加到XNA项目,并作为XNB文件一起编译。它可以工作,因为我现在可以使用ContentManager来加载和卸载我的图片。然而,这不是一个好的解决方案,因为如果我需要添加、删除或更改图片,我必须重新编译并部署整个程序!!我现在没有时间,但在周末我会写一个小程序来重新创建问题并发布代码。谢谢你的帮助!是的,我通常会为每个纹理使用单独的ContentManager,以便在必要时卸载它。但是,Zune Picture API既不使用也不公开任何ContentManager来允许我控制加载和卸载。它只有一个名为GetTexture的方法。它不使用正常的内容。加载模式!这就是为什么我如此沮丧的原因!:-(啊,我没有意识到它在zune上有很大的不同。稍微阅读一下MSDN(这是一个完全的猜测)你能不能在图片上调用dispose(不是纹理,而是你称之为GetTexture的图片),这样应该释放图片使用的所有非托管资源(包括其纹理)