記憶體壓力報告
記憶體壓力報告可讓 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 結構。
範例程式碼
下列範例顯示測量記憶體壓力的兩個函式。 第一個會開始測量間隔,而第二個則會擷取度量的結果。
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;
}
相關主題