我的问题在标题上不明确[我不能完全写出来]
例如Texture2D picture = Content.Load<Texture2D>("myPicture");
如果上面的代码运行,内存会发生什么?据我所知,Content将“myPicture”缓存到内存并返回对Texture2D图片的引用。我错了吗 ?如果将“myPicture”加载到另一个Texture2D对象,则“myPicture”不会重复,因此它只返回一个引用。
每个文件(或内容文件)是否通过内容加载到内存(也在Ram上分配)而不重复? (我相信我的问题应该检查上面写的所有内容)
谢谢!
答案 0 :(得分:10)
ContentManager
的每个实例只会加载任何给定的资源一次。第二次请求资源时,它将返回上次返回的相同的实例。
ReferenceEquals(Content.Load<Texture2D>("something"),
Content.Load<Texture2D>("something")) == true
为此,ContentManager
维护一个内部加载的所有内容的列表。此列表可防止垃圾收集器清理这些资源 - 即使您没有使用它们。
要卸载资源并清除该内部列表,请致电ContentManager.Unload
。这将释放加载的资源正在使用的内存。现在,如果再次请求相同的资源 - 它将被重新加载。
当然,如果您在调用Unload
时 使用这些资源,那么您加载的所有这些共享实例都将被处置并无法使用。
最后,不要对来自Dispose
的任何内容调用ContentManager.Load
,因为这会破坏所有正在共享的实例,并在ContentManager
尝试处理时导致问题他们稍后会在Unload
。