内存压力报告

内存压力报告使 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