共用方式為


記憶體壓力報告

記憶體壓力報告可讓 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
    )
{
    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;
}

Direct3D 影片 API