Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA 4.0 GameStateManagement屏幕未释放内存_C#_Memory Management_Dispose_Xna 4.0 - Fatal编程技术网

C# XNA 4.0 GameStateManagement屏幕未释放内存

C# XNA 4.0 GameStateManagement屏幕未释放内存,c#,memory-management,dispose,xna-4.0,C#,Memory Management,Dispose,Xna 4.0,我正在使用GameStateManagement,我的游戏内存有问题。我把游戏的每一部分都作为一个不同的屏幕。我有一个屏幕的标志,一个屏幕的主要标题,等等。我想我一直在管理错误的屏幕,但我一直很难找到我的问题的信息 当这个logo屏幕转到title菜单屏幕时,它似乎没有释放这个logo屏幕的内存资源,我的所有屏幕似乎都有这个问题,内存开始堆积。我做得对吗?我是否需要在我的纹理上调用Dispose(),或者在UnloadContent下调用?我是否正确卸下了屏幕?有没有想过我做得不对 这是我的徽标

我正在使用GameStateManagement,我的游戏内存有问题。我把游戏的每一部分都作为一个不同的屏幕。我有一个屏幕的标志,一个屏幕的主要标题,等等。我想我一直在管理错误的屏幕,但我一直很难找到我的问题的信息

当这个logo屏幕转到title菜单屏幕时,它似乎没有释放这个logo屏幕的内存资源,我的所有屏幕似乎都有这个问题,内存开始堆积。我做得对吗?我是否需要在我的纹理上调用Dispose(),或者在UnloadContent下调用?我是否正确卸下了屏幕?有没有想过我做得不对

这是我的徽标屏幕:

namespace Tower_Defense
{
    class Logo : GameScreen
    {
        Tower_Defense curGame;
        GraphicsDeviceManager graphics;
        AudioManager audioManager;
        Texture2D logoTexture;
        int gamecycles;

        public Logo(Tower_Defense game, GraphicsDeviceManager g, AudioManager am)
        {
            curGame = game;
            audioManager = am;
            graphics = g;
            EnabledGestures = GestureType.Tap;
        }

        public override void LoadContent()
        {
            base.LoadContent();

            logoTexture = Load<Texture2D>("Textures/Backgrounds/logo");

            gamecycles = 0;
        }

        public override void UnloadContent()
        {
            base.UnloadContent();
        }

        public override void Draw(GameTime gameTime)
        {
            ScreenManager.SpriteBatch.Begin();

            ScreenManager.SpriteBatch.Draw(logoTexture, Vector2.Zero, Color.White);

            ScreenManager.SpriteBatch.End();
        }

        public override void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen)
        {
            gamecycles++;

            if (gamecycles >= 60)
            {
                ScreenManager.AddScreen(new TitleScreen(curGame, graphics, audioManager, false), null);
                this.UnloadContent();
                ScreenManager.RemoveScreen(this);
            }

            base.Update(gameTime, otherScreenHasFocus, coveredByOtherScreen);
        }
    }
}
namespace Tower\u防御
{
类别标志:游戏屏幕
{
塔楼防御游戏;
图形管理器图形;
AudioManager AudioManager;
纹理2d标志纹理;
智力游戏周期;
公共标识(塔防游戏、图形管理员g、音频管理员am)
{
curGame=游戏;
audioManager=am;
图形=g;
EnabledGestures=GestureType.Tap;
}
公共覆盖无效加载内容()
{
base.LoadContent();
logoTexture=加载(“纹理/背景/徽标”);
游戏周期=0;
}
公共覆盖无效内容()
{
base.UnloadContent();
}
公共覆盖无效绘制(游戏时间游戏时间)
{
ScreenManager.SpriteBatch.Begin();
ScreenManager.SpriteBatch.Draw(logoTexture,Vector2.Zero,Color.White);
ScreenManager.SpriteBatch.End();
}
公共覆盖无效更新(游戏时间、bool otherscreen焦点、bool coveredByOtherScreen)
{
游戏周期++;
如果(游戏周期>=60)
{
ScreenManager.AddScreen(新标题屏幕(curGame,graphics,audioManager,false),null);
这是一个.UnloadContent();
ScreenManager.RemoveScreen(此);
}
更新(游戏时间,其他屏幕有焦点,被其他屏幕覆盖);
}
}
}

ContentManager
“拥有”它加载的所有资源。你不能自己卸下它们。您只能使用
ContentManager.unload
-卸载特定管理器加载的所有内容。()


因此,如果你想在每个屏幕上加载和卸载资源,你必须为每个屏幕创建一个
ContentManager
实例。

你是如何衡量内存使用率的?这是有道理的,但我有一些问题。创建一个新的ContentManager似乎需要一个IServiceProvider构造函数,所以我想也许我可以将相同的ContentManager传递给每个新屏幕,然后在进入每个新屏幕之前一直清除它。base.UnloadContent()有点让我困惑。我试着这样做,以为我会使用相同的内容管理器,但在加载下一个屏幕时,它给了我一个空纹理。这个ContentManager的东西把我弄糊涂了。@Ted:你可以从
Game.Services
获得
IServiceProvider
(这是
Game.Content
的同一个服务提供商)
base
只是指
GameScreen
(“在我的父类上调用此方法”)。您应该可以右键单击它,然后按“转到定义”查看它的功能(如果您有
GameScreen
)的源代码。感谢您的帮助,我将从Game.Services中获取该功能,并在明天再试一次,时间还早。我决定不想等待尝试,似乎我已经得到了你的建议,每个屏幕都有自己的内容管理器来工作。这使我的内存使用量减少了不少。