はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX12 ID3D12DebugDeviceのReportLiveDeviceObjectsを使ってメモリリークを確認する

あいさつ

どうも、はかせです。
今日も今日とてPMDファイルの描画・・・
と言いたいところなんですが、
昨日作ったプログラムを実行すると
メモリリークを起こしてしまいました。

なのでメモリリークの解消が当面の課題となります。

今日はDirectX12で一体何のオブジェクトが残ってしまっているのか
調べるためにID3D12DebugDevice
ReportLiveDeviceObjectsというものを使った話です。

ID3D12DebugDeviceとは

名前の通りD3D12のデバッグを行うデバイスインターフェースです。
docs.microsoft.com

こいつの中にある
ID3D12DebugDevice::ReportLiveDeviceObjectsを呼び出すことで
呼び出したタイミングで一体何のオブジェクトが生きているのかを出力窓に出すことができます。
docs.microsoft.com

ID3D12DebugDeviceの作り方

ID3D12DeviceのQueryInterfeceの引数に
ID3D12DebugDeviceのダブルポインタを入れてやるだけです。

ダブルポインタってのはポインタのポインタです。
ComPtrでダブルポインタを扱うやり方はこちらをどうぞ
hakase0274.hatenablog.com

では実際のコードです。

//使用変数
ComPtr<ID3D12Device> mDevice;
ComPtr<ID3D12DebugDevice> mDebugDevice; 

//デバイスの作成は割愛
mDevice->QueryInterface(mDebugDevice.GetAddressOf());

これでID3D12DebugDeviceのオブジェクトインスタンスが取得できました。

ReportLiveDeviceObjectsの呼び方

ReportLiveDeviceObjectsは呼び出したタイミングでの
生存オブジェクトを出力窓に出してくれます。

つまりプログラムの頭とか
ランタイム中に呼び出しても大して意味はありません。
(もちろん意図したタイミングでちゃんとできてるかを
確かめるって意味なら使えます)

基本はD3D12の管理クラスかなんかのデストラクタか
解放メソッドの中で呼んでやるのが定石かと思います。

ReportLiveDeviceObjectsの引数はD3D12_RLOD_FLAGSというenumです。
docs.microsoft.com


これは出力窓に出力する情報の精度や酒類なんかを指定します。
基本私は
D3D12_RLDO_SUMMARY(概要表示)
D3D12_RLDO_DETAIL(詳細表示)
このどちらかを使うことが多いです。

今回はD3D12_RLOD_DETAILを指定して
管理クラスのデストラクタで使ってみます。

//使用変数
ComPtr<ID3D12DebugDevice> mDebugDevice; 

mDebugDevice->ReportLiveDeviceObjects(D3D12_RLDO_DETAIL);

結果です。
f:id:hakase0274:20191014161953p:plain

めっちゃリークしてますね・・・

あとがき

今回はメモリリークを調べるため
ID3D12DebugDeviceのReportLiveDeviceObjectsを使ってみた話でした。

使い方はほとんどDirectX11の時と変わらないですね。
使うのにそこまで手こずりませんでした。

メモリリークの原因そのものは
多分テクスチャマッピングをやろうとして
失敗してるんだろうなーとは予想を立てていますが、
実際は調べてみないことにはなんともわからんですね。

これも自分がスマートポインタに慣れていないからでしょうね。
地雷っぽいところのあたりは付けれても確信まではいかないって言うね。

まぁそれもきっと時間が解決してくれる問題だと思うので
焦らず騒がずマイペースに慣れていこうと思います。

今回の記事が良ければスターやコメント等よろしくお願いします。
それでは今回はこの辺でノシ