XNA SpriteBatch.End() ObjectDisposedException

У меня возникли проблемы с брошенным исключением. Ниже приведен метод рисования из цикла XNA.

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);
        }
    }

Графические компоненты хранятся в List<> в graphicsSystem. Я думаю, что часть проблемы может заключаться в том, что я работаю над проектами. Верхний цикл выше в проекте XNA. Второй метод рисования находится в созданной мной игровой библиотеке. И, наконец, фактическая реализация метода component.draw() находится в третьем проекте, специфичном для текущей игры, над которой я работаю. поле текстуры в графической системе инициализируется из функции Content.Load при построении графической системы.

Я пробовал пару разных вещей. Я переместил spritebatch.begin и spritebatch.end в графическую систему, что все равно привело к исключению. Исключение не появляется, когда список компонентов в графической системе пуст.

Я не уверен, выходит ли загруженная текстура из области видимости, когда область перемещается из одного проекта в другой, но я не думаю, что это должно быть так. У меня также была такая же установка в одном проекте, который работал, однако я реорганизовал несколько, чтобы использовать некоторый код в другом месте. Я не призываю утилизировать где-либо текстуру, которая исчезает, поэтому я даже не уверен, что начну охоту.

Если это не ясно, дайте мне знать, и я постараюсь уточнить.

1 ответ

Решение

Мне нужно знать, как вы управляете контентом...

Я полагаю, если вы не утилизируете текстуры вручную, вы в некоторых местах используете Менеджер контента.

Когда вы загружаете ресурсы с помощью game.Content.Load(asset), менеджер контента сохраняет список загруженных ресурсов, а менеджер контента отвечает за их освобождение при вызове game.Cntent.Dispose().

Другие вопросы по тегам