【问题标题】:Can I unload a Texture2D variable in C# and XNA 4.0?我可以在 C# 和 XNA 4.0 中卸载 Texture2D 变量吗?
【发布时间】:2015-08-11 05:11:31
【问题描述】:

我正在使用 C# 和 XNA 4.0 制作游戏,我想使用纹理向玩家显示关卡选择菜单中每个关卡的屏幕截图。 因为我只使用一种纹理,所以每次播放器在菜单上突出显示一个新选项时,我都需要加载一个新纹理。我这样做的代码类似于以下:

Texture2D levelTexture;

if(user.HighlightsNewOption)
{
    //Notice that there is no form of unloading in this if statement
    string file = levelSelectMenu.OptionNumber.ToString();

    levelTexture = Content.Load<Texture2D>(file);
}

但是,我担心当前的设置会导致内存使用问题。这个问题会通过先卸载纹理然后加载新纹理来解决吗?如果是这样,我该怎么做?

【问题讨论】:

    标签: c# memory xna textures


    【解决方案1】:

    您无法卸载单个纹理。但是,您可以使用 ContentManager.Unload() 一次性卸载整个 ContentManager 实例的内容。

    我在 XNA 中处理内存管理的方式是将游戏屏幕和菜单模块化为组件。每个都有自己的 ContentManager 实例,在不再需要时卸载它们。

    使用这种理念,我不会担心这里的内存使用情况。为您的菜单提供自己的 ContentManager 实例。加载菜单内容时一次加载所有屏幕截图。当菜单退出时,卸载它并使用ContentManager.Unload()卸载它的内容。

    您的播放器设备可能可以处理一些屏幕截图。如果您有 100 个级别,您可以将每个级别限制为一个小缩略图。

    如果您真的非常需要,您可以让每个屏幕截图都有自己的组件,该组件有自己的ContentManager,但不建议这样做。

    如需进一步阅读,请尝试:How do I unload content from the content manager?

    【讨论】:

    • 对。我最初使用的是 Texture2D 变量列表。有 64 个级别,所以我会一次加载 64 个纹理的列表。所以,你是说我应该使用新的 ContentManager 加载关卡纹理列表,并在玩家不使用关卡选择菜单时将其卸载(并在它们使用时再次加载)?
    • 此外,该游戏适用于 Windows PC,而不是 Android 等,以防万一。
    • 这听起来很对。我会试一试并监控内存使用情况。如果它太高,您可以尝试更改纹理格式或降低分辨率。 (编辑:另外,如果加载纹理需要大量时间,您可以在用户单击级别描述时以与您在问题中编写相同的方式一一加载它们。然后,当您完成, 卸载专用的 ContentManager)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2011-05-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多