メモリリークとの戦い

シャドウマップを実装中に、ふとどのくらいメモリを消費しているのだろうと調べてみると…

何かどんどん増えてる…

そう、Managedではなかなかお目にかからないメモリリークというやつです。Managed DirectXを使っているとはいえ、中身はUnManagedなのでちゃんとメモリを開放してやらなくてはいけません。
で、調べてみると、、、どこがリークしているか分からん。そもそも、どれが開放できるオブジェクトでどれが自動的に開放されるオブジェクトかも分からん。
2時間くらい色々試して調べてみると、どうやら

device.SetRenderTarget(0,ShadowMapTex.GetSurfaceLevel(0));

の一文が悪さをしていたみたいです。SurfaceクラスはUnManagedのため、「GetSurfaceLevel」を呼び出したときに出来たSurfaceオブジェクトが残ってしまったようです。ん〜、やっぱりDirectXは大変だな。とりあえず、

Surface s = ShadowMapTex.GetSurfaceLevel(0);
device.SetRenderTarget(0,s);
s.Dispose();

として解決しました。ふぅ〜〜
ちなみに、シャドウマップは影がギザギザしてしまってあまり綺麗ではないので、ちょっと発展型のPSMを調べて実装しようかと思います。(そのうちに。)

今日は、これに加えて「モーションブラー」を実装しました。画像はそのうちアップします。
とりあえず、影はひと段落。次は、HDRレンダリングをやろうと思います。やっぱり、光の表現は重要ですから!!(2Dでも)