金曜日, 1月 06, 2006

マネージドDirectXにてSprite, Fontオブジェクトの解放時にNullReferenceExceptionが発生する

という何ヶ月も前から放置していた問題が解決した。
他にも悩んでいる人がもしかするといるかもしれないので記しておく。(いないか)
Managed DirectXにて、アプリケーション終了時に、必ずSpriteまたはFontのOnLostDeviceメソッド内部でNullReferenceExceptionが発生していた。
原因は、Formを解放した後にSprite/Font(つまりDeviceオブジェクト)を解放してしまっていたこと。つまり、Font/Spriteオブジェクトは(恐らく)内部でフォームのウィンドウハンドルを使用していて、先にフォームを解放してしまうと、OnLostDevice内部でエラーを吐いてしまうらしい。

解決法として僕が採用したのは、FormのDisposeメソッド内部で、Device/Sprite/Fontを解放してあげること。
マネージドDirectXは、結局従来のDirectXの薄いラッパーであるらしく、内部のアンマネージなオブジェクトは、明示的にDisposeしなあかんやつも時々ある。Disposeの順序を制御するための情報として、IDisposableインタフェースのヘルプでも読めば参考になることであろう。


今日は初スロ打ってきた。吉宗965あたりから打ち始めて1800Gまで回し天井化け単、193Gでやめで-31000円。痛すぎる。後1万足せばXBox+リッジ買えたね。つか965Gから回し始めるなんてどうかしてた。おみくじ引かへんかったけど、今年の運勢はもう見えたな。

1 件のコメント:

mj さんのコメント...

私もこの現象で悩んでいたので大変助かりました。ありがとう御座いました。