【问题标题】:XNA SpriteBatch.End() ObjectDisposedExceptionXNA SpriteBatch.End() ObjectDisposedException
【发布时间】:2023-04-06 23:47:02
【问题描述】:

我在抛出异常时遇到了一些问题。下面是 XNA 循环中的 draw 方法。

protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);

        checkInitialization();  // Makes sure that the graphics loader has been initialized
        spriteBatch.Begin();
        GameRunner.CurrentGame.GraphicsSystem.Draw(this.spriteBatch);
        spriteBatch.End();  // Exception is thrown here

        base.Draw(gameTime);
    }

这是来自图形系统的绘制方法。

public void Draw(SpriteBatch spriteBatch)
    {
        foreach (GraphicsComponent component in this.components)
        {
            component.Draw(spriteBatch, this.texture);
        }
    }

图形组件存储在 graphicsSystem 中的 List 中。我认为问题的一部分可能是我跨项目工作。上面的 Top 循环在一个 XNA 项目中。第二种绘制方法在我构建的一个游戏库中。最后,component.draw() 方法的实际实现是在第三个项目中,该项目特定于我正在开发的当前游戏。图形系统中的纹理字段是在构建图形系统时从 Content.Load 函数初始化的。

我尝试了几种不同的方法。我将 spritebatch.begin 和 spritebatch.end 移动到图形系统中,仍然导致异常。当图形系统中的组件列表为空时,不会出现异常。

我不确定当范围从一个项目移动到另一个项目时加载的纹理是否超出范围,但我认为不应该是这种情况。我在一个可行的项目中也有相同的设置,但是我正在重构为多个以在其他地方使用一些代码。我不会在正在消失的纹理的任何地方调用 dispose,所以我什至不确定是否要开始狩猎。

如果不清楚,请告诉我,我会尽力详细说明。

【问题讨论】:

    标签: c# xna objectdisposedexception


    【解决方案1】:

    我想知道你是如何管理内容的……

    我想如果你不手动处理纹理,你是在某个地方处理内容管理器。

    当您使用 game.Content.Load(asset) 加载资源时,内容管理器会保留已加载资源的列表,并且内容管理器负责在调用 game.Cntent.Dispose() 时释放它们。

    【讨论】:

    • 我打算获取一些代码来向您展示我是如何管理内容并找到问题的。我在创建 Game 类时正在加载纹理,但就在我调用 Initialize() 之前,我卸载了所有内容。我只需要重新排序电话。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多