プログラミング メモリリークが治った
あいさつ
どうも、はかせです。
前回、前々回とメモリリークに苦しめられてきました。
ですが、今回でその戦いにも終止符が打たれます。
リークしていたもの
前回の記事でもあげましたが、
私が殲滅しなければいけないやつらはこいつらです。
色々あるんですが、まとめてしまうと
描画に関するもの全てです。
解決
結論から言うと手動で徹底的に破棄しました。
私のプログラムは基本スマートポインタ頼りの管理をしていました。
(ぶっちゃけ楽だったし・・・)
ただ、その状態でリークが発生してしまったので
色々処理順とか弄ってみたんですが解決できませんでした。
なので最終手段「ゴリ押し」
あえてリークしていたリソースを生ポインタで扱い、
私が自ら責任もって確保と解放を行いました。
さらに解放の際にも単純にReleaseするだけでなく、
ダメ押しと言わんばかりにnullptrを代入しました。
//テクスチャ情報を保持 struct TEXTURE_DATA { std::wstring fileName; ID3D11Resource* texture; ID3D11ShaderResourceView* shaderView; ~TEXTURE_DATA() { if (texture) { texture->Release(); texture = nullptr; } if (shaderView) { shaderView->Release(); shaderView = nullptr; } } };
その結果
やったー!!!
遂にあの憎たらしいメモリリーク警告が消え去りました!
いやーERRORもWARNINGもでてないコンソールってのは気持ちがいいですね!
ちょっと紹介
今回デバッグをする上で大量のログを出しました。
そのため今までのVSのログだとエラーなのかわかりにくかったです。
なので今回一つ拡張を入れました。
github.com
これはログに色を付けてくれる拡張です。
わかりやすい・・・!
追加の改良点
今回メモリリーク解決のために色々データの持ち方とか
作り方とか弄ってたら初期ロードの時間が3分の1ぐらいになりました。
今現状使っているシェーダーだと、どのみち作るBufferやSamplerとか
変わらないので最初に一つ作るだけにしたのが大きかったなと思います。