【问题标题】:XNA How does the ContentManager handle with memoryXNA ContentManager 如何处理内存
【发布时间】:2012-03-25 12:01:18
【问题描述】:

我的问题在标题上不清楚[我不能准确地写出来]

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

如果上面的代码运行,内存会发生什么?据我所知,内容将“myPicture”缓存到内存并返回对 Texture2D 图片的引用。我错了吗 ?如果“myPicture”被加载到另一个 Texture2D 对象,“myPicture”不会被复制,所以它只返回一个引用。

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

谢谢!

【问题讨论】:

    标签: xna content-management


    【解决方案1】:

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

    ReferenceEquals(Content.Load<Texture2D>("something"),
                    Content.Load<Texture2D>("something")) == true
    

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

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

    当然,如果您在调用Unload正在使用这些资源,那么您加载的所有这些共享实例都将被丢弃且无法使用。

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

    【讨论】:

    • 感谢您的帖子!加载的资源更多地保留在内存中,对吗? (你关于卸载的句子对我来说很清楚,但我再问一次,我的英语不够好,无法完全理解。)
    • 恐怕我不明白你的问题。
    • Texture2D 图片 = Content.Load("myPicture");运行此行后,myPicture 被加载到内存(到计算机的 ram),并且它的引用由 Content 返回到 Texture2D 实例图片。 -> 真还是假?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多