すまーとぽいんた
目指せリーク0プログラム。
と言う訳で、DirectXのCOMとスマートポインタに関するメモ。
DirectXのリソース(IDirectHogehoge)はCOMインターフェース型なので、内部にカウンタを持ち、
Release される毎にそのカウンタがデクリメントされ、0==カウンタ となった場合にリソースが解放される。
で、その辺のカウンタの増減とかの管理は COMスマートポインタクラス である CComPtr クラス を使えば解決するんだけど、
ここで厄介なのが、暗黙の AddRef(カウンタの増加) が行われる関数が多くあるという事。
GetRenderTarget、GetDepthStencilSurface、GetSurfaceLevel 等 Get 系は危ないらすぃ。
対策としては、
・通常時は CComPtr もしくは 自前のCOMスマートポインタクラス を使用してカウンタを管理する
※コピーコンストラクタ、代入演算の際のカウンタ制御を行えるのが最低条件
・Get 関数使用後はカウンタチェックを行い、きちんと Release してカウンタを減らしておく
※↑みたいな事やってられないので、D3D_DEBUG_INFO などのリーク検出機構を使用して、どこで確保したリソースが解放されていないのかを把握し対応する
※※リソース絡みの関数は、使用前に カウンタ をどう扱うか一度チェックしてから実装に入る癖を付けた方が良いかも?
※※※と思ったらリファレンスに書いてあるじゃん。無駄な努力せずに素直にリファレンス読むべし
ってな感じかなぁ。
ついでに、ゲームで使用する場合は同一のIDirectXのリソースを使いまわしまくるので、以下の機能があった方が良いかも?
・別のリソースを代入時にリソース解放をしてくれる(解放忘れて別のテクスチャ読む時とかのリークを防ぐ)
・NULL 代入でリソース解放してくれる(あると便利)
・明示的な解放処理を持たせる(シーン遷移毎にごりごり読み書きするので必須)
・D3DXCreteTextureFromFile みたいな、インスタンスを生成する関数の引数として渡す場合に、カウンタを増加させる仕組みを持たせる
スレッド管理クラスと共に、土日で実装を終わらせたいが果たして……。