内存压力报告
内存压力报告使 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;
}
相关主题