質問者
XNAゲームコンポーネントについて

全般的な情報交換
すべての返信
-
ごめんなさい。今日一日中エラーを追ってみてわかったことは、コンポーネント内でTexture2Dをロードし、コンポーネントのUnloadメゾッドで破棄していて、またそのコンポーネントを新しく生成したときに、おそらくTextureをロードできないみたいです。エラーの位置はspriteBatchクラスのEndメゾッドで、Can not access a disposed object.Object name: 'Texture2D'.と表示されます。一度破棄したテクスチャは再びロードされることはないのでしょうか?回答おねがいしいます。2011年10月2日 16:08
-
自作コンポーネント内のUnloadContentメゾッドです。protected override void UnloadContent(){titleLogo.Dispose();base.UnloadContent();}
titleLogoは自作クラスのインスタンスで、自作クラスにDisposeメゾッドを実装しています。public void Dispose(){if (texture != null){this.texture.Dispose();}}textureはTexture2Dのインスタンスです。
game.Content.Load<Texture2D>("data/imgdata/title")でテクスチャをLoadしています。上記の自作コンポーネントのインスタンスを破棄し、再び生成すると、テクスチャがロードされていないみたいです。2011年10月3日 13:59 -
Disposeというのはオブジェクト内で使っている「ネイティブ」リソースを破棄するものであって、オブジェクトそのものを解放する訳ではありません。ですから、Disposeを呼び出してもオブジェクトは参照されている限り存在し続けます。ここでの問題はgame.Contentが読み込んだオブジェクトをキャッシュしていて、Dispose後に読み込もうとしてもオブジェクト自体が存在しているので、Content.LoadはDisposeが呼び出された後と同じオブジェクトを返してくるのが原因です。
こういったリソースのライフタイムの管理はContentManagerに任せるのが良いでしょう。この場合はコンポーネントにContentManagerを持たせ、それを介してLoad/Unload、もしくはDisposeを呼ぶようにすると良いでしょう。
2011年10月4日 23:31