記憶體壓力報告
記憶體壓力報告可讓 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;
}
相關主題