【问题标题】:Draw giving me an objectDisposedException绘制给我一个 objectDisposedException
【发布时间】:2015-01-13 22:19:30
【问题描述】:

下面的代码给了我一个 ObjectDisposedException。我在内容加载器中加载内容就好了。它有时会起作用,但偶尔会引发异常。

所有纹理都完美加载,每个对象都有正确的纹理并且实际存在。我没有任何地方可以卸载内容。

在最后一个spriteBatch.End()时抛出错误;

出了什么问题?

 protected override void Draw(GameTime gameTime)
        {
            if (startMenu.showMenu)
            {
                spriteBatch.Begin();
                startMenu.Draw(spriteBatch);
                spriteBatch.End();
            }
        if (selectedLevel != null && !startMenu.showMenu)
        {
            spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null,
            selectedLevel.GetCamera().getViewMatrix(new Vector2(1.0f)));
            for (int layer_inc = 0; layer_inc <= selectedLevel.layers.Count() - 1; layer_inc++)
            {
                selectedLevel.layers[layer_inc].Draw(gameTime, spriteBatch);
            }
            if (selectedLevel.GetPlayer().IsAlive())
            {
                Weapon weapon = selectedLevel.GetPlayer().GetWeapon();
                weapon.Draw(gameTime, spriteBatch);

                if (selectedLevel.GetPlayer().isMeditating())
                {
                    Player player = selectedLevel.GetPlayer();
                    MeditationBoost meditationBoost = ((MeditationBoost)player.getBoost());
                    meditationBoost.Draw(spriteBatch, player.position);
                }
                if (weapon is ShootableWeapon)
                {
                    ShootableWeapon shootableWeapon = (ShootableWeapon)weapon;

                    if (shootableWeapon.getAmmo().Count() > 0)
                    {
                        for (int ammo_inc = 0; ammo_inc <= shootableWeapon.getAmmo().Count() - 1; ammo_inc++)
                        {
                            shootableWeapon.getAmmo()[ammo_inc].Draw(gameTime, spriteBatch);
                        }
                    }
                }
            }
            foreach (MovableObject movableObject in selectedLevel.movableObjects)
            {
                if (movableObject is Enemy)
                {
                    Enemy enemy = (Enemy)movableObject;
                    ThrowAttack attack = ((ThrowAttack)enemy.getAttack());
                    if (attack != null && attack.getThrowObject() != null)
                    {
                        attack.getThrowObject().Walk(Direction.Right, attack.getThrowObject().speed);
                        attack.getThrowObject().Update(gameTime);
                        attack.getThrowObject().Draw(spriteBatch);
                    }
                }
            }
            updateScreenText(spriteBatch);
            try
            {
                spriteBatch.End();
            }
            catch (ObjectDisposedException e)
                {
                    Debug.Write(e);
                }
        }
        base.Draw(gameTime);
    }

编辑:

这就是我动态加载内容的方式(使用此函数时我将文件夹作为字符串提供)

    public void Loadlistontent(string contentFolder)
    {
        DirectoryInfo dir = new DirectoryInfo(Content.RootDirectory + "/" + contentFolder);
        if (!dir.Exists)
            throw new DirectoryNotFoundException();

        FileInfo[] files = dir.GetFiles("*.*");
        foreach (FileInfo file in files)
        {
            if (!textureLoader.GetTextures().ContainsKey(file.Name))
            {
                string key = Path.GetFileNameWithoutExtension(file.Name);


                Texture2D texture = Content.Load<Texture2D>(contentFolder + "/" + key);
                textureLoader.addTexture(file.Name, texture);
            }
        }
    }

【问题讨论】:

  • updateScreenText() 在做什么?

标签: c# xna objectdisposedexception


【解决方案1】:

在代码中的任何点,您调用Content.Unload() 还是Texture2D.Dispose()? 似乎其中之一可能隐藏在Spritebatch.Begin()Spritebatch.End() 之间。正如乔所说,它可能位于updateScreenText()

Spritebatch.End() 引发异常的原因是 spritebatch 将您的精灵“批处理”在一起以进行单个绘图调用。但正是在单次绘制调用中,所有已处置内容的异常都将被抛出,因为那是它们真正被使用的时候。

【讨论】:

  • 我不在任何地方使用 unload() 或 dispose()。我现在检查了整个项目两次。 updateScreenText 只是简单地在屏幕上写入一些带有现有信息的文本。
  • 我要做的是评论 spritebatch.begin() 和 spritebatch.end() 之间的所有内容。如果代码没有引发异常,那么只需慢慢地取消注释行,直到再次获得异常。这会告诉您哪条线路有问题。如果是方法调用,请将方法的代码贴出来让我看看。
  • 但我使用了两个 spritebatch.begin。哪一个应该是令人不安的?仅当 startMenu.showMenu 为 true 时才会执行 startMenu.Draw。在其他 spritebatch.begin 的情况下,情况并非如此。
  • 我确实注意到我的纹理列表(我存储纹理的列表)在纹理上包含此错误:随机值上的“无法评估表达式”。这或许可以解释为什么我在玩游戏时会随机出现此错误。什么触发了这个错误?我可以重新加载表达式。我用加载内容的方式编辑了我的主要帖子。
  • 抱歉回复晚了。显然,正如您所说,令人不安的是第二个 spritebatch.begin spritebatch.end 对。因此,将这些行之间的所有内容都注释掉,看看它是否有效,然后逐行取消注释。
猜你喜欢
  • 2014-04-14
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2020-05-30
  • 2015-08-28
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多