記憶體壓力報告

記憶體壓力報告可讓 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 結構。

範例程式碼

下列範例顯示測量記憶體壓力的兩個函式。 第一個會開始測量間隔,而第二個則會擷取度量的結果。

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