【发布时间】:2012-10-08 21:16:06
【问题描述】:
我开始了一个项目,其概念是在整个游戏中不断重复使用相同的 texture2d 对象,并定期重新加载新的纹理。随着时间的推移,这被证明是一个坏主意,因为我遇到了:System.OutOfMemoryException
bool loadImages(string image)
{
System.Diagnostics.Debug.WriteLine("beginning loading textures " + image);
try
{
//image_a = null;
//image_o = null;
//image_o.Dispose();
//image_a.Dispose();
image_o = Content.Load<Texture2D>("images/"+image);
image_a = Content.Load<Texture2D>("images/" + image+"_a");
return true;
}
catch
{
System.Diagnostics.Debug.WriteLine("cannot load textures " + image);
image_a.Dispose();
image_o.Dispose();
}
return false; //make sure the caller loads the subsequent image
}
我猜想 XNA 在每次加载新内容时都会保留过去的纹理,所以我重写了程序,改为保留一个游戏对象列表,每个对象都有自己的 texture2d 对象。在浏览列表后,我将处理上一个列表项的纹理对象并将下一个列表项的纹理加载到其纹理对象中。该列表只会在整个游戏中遍历一次,我会定期移动到下一个纹理集,并且我只会选择 2 个要加载的纹理,所以理论上,内存中应该只需要 2 个纹理.我仍然遇到内存错误。就好像我根本无法依靠 dispose 方法及时从内存中释放纹理一样。
我正在加载的纹理都不超过 125KB,我正在为 windows phone 7 构建它
删除不再需要的纹理的最佳方法是什么?参考代码:我应该创建新的 texture2d 对象,交换它们,然后处理原始对象吗?
【问题讨论】:
-
这对于您的目的可能为时已晚,但 contenttracker.codeplex.com 能够卸载单个内容项,并且它还可以处理内容项之间的内部引用的复杂问题,例如模型 ->纹理。
标签: memory-management xna textures out-of-memory