次の方法で共有


メモリ負荷レポート

メモリ負荷レポートを使用すると、Direct3D アプリケーションは、ビデオ メモリワーキング セットがいつ大きくなりすぎたかを判断できます。

メモリ負荷 は、アプリケーションによってメモリ サブシステムに対して行われる要求です。 Direct3D アプリケーションではメモリ負荷レポートを使用できますが、この機能は Direct3D を使用してビデオをレンダリングするアプリケーションに特に役立ちます。 ビデオ再生は通常、フレームを事前にデコードできるように、大量のバッファリングの恩恵を受けます。 バッファリングを行うと通常、再生がスムーズになりますが、次の要因により、ワーキング セットが大きくなりすぎると、実際にはパフォーマンスが低下する可能性があります。

  • メモリがキャッシュから削除される可能性があります。 最悪の場合、これはすべてのビデオ フレームで発生する可能性があります。
  • メモリ割り当ては、最適ではないメモリ セグメントに配置される場合があります。

Windows 7 以降、Direct3D はビデオ メモリの負荷に関するいくつかの統計情報を報告できます。

  • プロセスによって一定の間隔で削除されたバイト数。
  • 最適ではないメモリ セグメントに配置されるメモリの量。
  • 最適でないメモリに配置されたメモリ割り当ての全体的な効率を大まかに示します。

この情報は、アプリケーションが適切なワーキング セットを維持するのに役立ちます。

メモリ負荷レポートの使用

メモリ負荷レポートでは、既存の IDirect3DQuery9 インターフェイスを使用してデバイスに対してクエリを実行します。 新しいクエリの種類が D3DQUERYTYPE 列挙に追加されました。

D3DQUERYTYPE_MEMORYPRESSURE        = 19,

このクエリを使用するには、次の手順を実行します。

  1. D3DQUERYTYPE_MEMORYPRESSURE フラグを使用して IDirect3DDevice9Ex::CreateQuery を呼び出します。 このメソッドは、 IDirect3DQuery9 インターフェイスへのポインターを返します。
  2. 測定間隔を開始するには、D3DISSUE_BEGIN フラグで IDirect3DQuery9::Issue を呼び出します。
  3. D3DISSUE_END フラグを使用して IDirect3DQuery9::Issue を呼び出します。
  4. IDirect3DQuery9::GetData を呼び出してクエリ結果を取得します。 クエリは D3DMEMORYPRESSURE 構造体を 返します。

コード例

次の例は、メモリ負荷を測定する 2 つの関数を示しています。 1 つ目は測定間隔を開始し、2 つ目は測定の結果を取得します。

HRESULT BeginMemoryPressureQuery(
    IDirect3DDevice9Ex *pDevice, 
    IDirect3DQuery9 **ppQuery
    )
{
    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;
}

Direct3D ビデオ API