XNA ContentManager如何处理内存

ica*_*tan 2 xna content-management

我的问题在标题上不明确[我不能完全写出来]

例如 Texture2D picture = Content.Load<Texture2D>("myPicture");

如果上面的代码运行,内存会发生什么?据我所知,Content将"myPicture"缓存到内存并返回对Texture2D图片的引用.我错了吗 ?如果将"myPicture"加载到另一个Texture2D对象,则"myPicture"不会重复,因此它只返回一个引用.

每个文件(或内容文件)是否通过内容加载到内存(也在Ram上分配)而不重复?(我相信我的问题应该检查上面写的所有内容)

谢谢 !

And*_*ell 10

每个实例ContentManager只会加载任何给定的资源一次.第二次请求资源时,它将返回上次返回的相同实例.

ReferenceEquals(Content.Load<Texture2D>("something"),
                Content.Load<Texture2D>("something")) == true
Run Code Online (Sandbox Code Playgroud)

为此,请ContentManager维护其内部加载的所有内容的列表.此列表可防止垃圾收集器清理这些资源 - 即使您不使用它们也是如此.

要卸载资源并清除该内部列表,请致电ContentManager.Unload.这将释放加载的资源正在使用的内存.现在,如果再次请求相同的资源 - 它将被重新加载.

当然,如果你正在使用这些资源,当你调用Unload,所有你加载这些共享实例将被安置,无法使用.

最后,不要调用Dispose任何出现的内容ContentManager.Load,因为这会破坏所有正在共享的实例,ContentManager并在Unload以后尝试处理它们时导致问题.

  • 基本上,是的.真正. (2认同)