2011-08-29 4 views
0

발생하는 예외에 대해 몇 가지 문제가 있습니다. 아래는 XNA 루프의 draw 메소드입니다.XNA SpriteBatch.End() ObjectDisposedException

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 프로젝트에 있습니다. 두 번째 draw 방법은 내가 만든 게임 라이브러리에 있습니다. 그리고 마지막으로 component.draw() 메서드의 실제 구현은 현재 작업중인 현재 게임에 대한 세 번째 프로젝트에 있습니다. 그래픽 시스템의 텍스처 필드는 그래픽 시스템 구축시 Content.Load 함수로 초기화됩니다.

나는 몇 가지 다른 것들을 시도했다. Spritebatch.begin 및 spritebatch.end를 그래픽 시스템으로 옮겼는데, 그래도 예외가 발생했습니다. 그래픽 시스템의 구성 요소 목록이 비어 있으면 예외가 나타나지 않습니다.

범위가 한 프로젝트에서 다른 프로젝트로 이동할 때로드 된 텍스처가 범위를 벗어나는 지 확실하지 않지만이 경우 여야합니다. 나는 또한 같은 종류의 설정을 하나의 프로젝트에서 수행했다. 그러나 다른 곳에서 코드의 일부를 사용하기 위해 여러개로 리팩터링했다. 나는 사라지고있는 텍스쳐의 어느 부분이라도 처분 할 것을 요구하지 않기 때문에 나는 사냥을 시작할 지조차 확실히 알지 못한다.

이것이 명확하지 않은 경우 알려 주시면 자세히 설명하려고합니다. 난 당신이 컨텐츠를 관리하는 방법을 알아야 것

답변

0

...

나는 수동으로 텍스처를 폐기하지 않으면, 당신은 어떤 장소에서 내용 관리자를 처분한다고 가정합니다.

game.Content.Load (asset)로 에셋을로드하면 콘텐츠 관리자는로드 된 리소스의 목록을 유지하고 content.Cntent.Dispose()가 호출되면 콘텐츠 관리자가이를 해제해야합니다.

+0

나는 콘텐츠를 관리하고 문제를 발견 한 방법을 보여주기 위해 몇 가지 코드를 얻을 것입니다. 내 Game 클래스를 만들 때 텍스쳐를로드하고 있었지만, Initialize()를 호출하기 직전에 모든 내용을 언로드했습니다. 전화를 다시 주문하면됩니다. 고맙습니다. –