メモリ不足レポート
メモリ不足レポートを使用すると、Direct3D アプリケーションは、ビデオ メモリワーキング セットがいつ大きすぎたかを判断できます。
メモリ負荷 は、アプリケーションによってメモリ サブシステムに対する要求です。 Direct3D アプリケーションではメモリ不足レポートを使用できますが、この機能は Direct3D を使用してビデオをレンダリングするアプリケーションに特に役立ちます。 ビデオ再生は通常、フレームを事前にデコードできるように、大量のバッファリングの利点があります。 通常、バッファリングの結果、再生がスムーズになりますが、次の要因により、ワーキング セットが大きくなりすぎるとパフォーマンスが低下する可能性があります。
- メモリがキャッシュから削除される可能性があります。 最悪の場合、これはすべてのビデオ フレームで発生する可能性があります。
- メモリ割り当ては、最適ではないメモリ セグメントに配置される場合があります。
Windows 7 以降、Direct3D はビデオ メモリの負荷に関するいくつかの統計情報を報告できます。
- プロセスによって一定期間に削除されたバイト数。
- 最適でないメモリ セグメントに配置されたメモリの量。
- 最適でないメモリに配置されたメモリ割り当ての全体的な効率を大まかに示します。
この情報は、アプリケーションが妥当なワーキング セットを維持するのに役立ちます。
メモリ不足レポートの使用
メモリ不足レポートでは、既存の IDirect3DQuery9 インターフェイスを使用してデバイスのクエリを実行します。 D3DQUERYTYPE 列挙型に新しいクエリの種類が追加されました。
D3DQUERYTYPE_MEMORYPRESSURE = 19,
このクエリを使用するには、次の手順を実行します。
- D3DQUERYTYPE_MEMORYPRESSURE フラグ IDirect3DDevice9Ex::CreateQuery を呼び出します。 このメソッドは、IDirect3DQuery9 インターフェイスへのポインターを返します。
- D3DISSUE_BEGIN フラグ IDirect3DQuery9::Issue を呼び出して、測定間隔を開始します。
- D3DISSUE_END フラグ IDirect3DQuery9::Issue を呼び出します。
- IDirect3DQuery9::GetData を呼び出してクエリ結果を取得します。 クエリは D3DMEMORYPRESSURE 構造体を返します。
コード例
次の例は、メモリ負荷を測定する 2 つの関数を示しています。 1 つ目は測定間隔を開始し、2 つ目は測定の結果を取得します。
HRESULT BeginMemoryPressureQuery(
IDirect3DDevice9Ex *pDevice,
IDirect3DQuery9 **ppQuery
)
{
if (!pDevice || !ppQuery)
return E_POINTER;
HRESULT hr = pDevice->CreateQuery(D3DQUERYTYPE_MEMORYPRESSURE, ppQuery);
if (SUCCEEDED(hr))
{
hr = (*ppQuery)->Issue(D3DISSUE_BEGIN);
if (FAILED(hr))
{
(*ppQuery)->Release();
*ppQuery = NULL;
}
}
return hr;
}
HRESULT EndMemoryPressureQuery(
IDirect3DQuery9 *pQuery,
D3DMEMORYPRESSURE *pResult
)
{
HRESULT hr = pQuery->Issue(D3DISSUE_END);
if (SUCCEEDED(hr))
{
hr = pQuery->GetData(pResult, sizeof(*pResult), D3DGETDATA_FLUSH);
}
return hr;
}
関連トピック