Compartilhar via


Relatório de pressão de memória

O relatório de pressão de memória permite que um aplicativo Direct3D determine quando seu conjunto de trabalho de memória de vídeo ficou muito grande.

A pressão de memória é a demanda colocada no subsistema de memória por um aplicativo. Embora qualquer aplicativo Direct3D possa usar relatórios de pressão de memória, esse recurso é especialmente útil para aplicativos que renderizam vídeo usando Direct3D. A reprodução de vídeo normalmente se beneficia de grandes quantidades de buffer, para que os quadros possam ser decodificados com antecedência. Embora o buffer geralmente resulte em uma reprodução mais suave, ele poderá realmente degradar o desempenho se o conjunto de trabalho ficar muito grande, devido aos seguintes fatores:

  • A memória pode ser removida do cache. Na pior das hipóteses, isso pode ocorrer em todos os quadros de vídeo.
  • As alocações de memória podem ser colocadas em segmentos de memória não otimizados.

A partir do Windows 7, o Direct3D pode relatar algumas estatísticas sobre a pressão de memória de vídeo:

  • O número de bytes removidos pelo processo em um intervalo de tempo.
  • A quantidade de memória colocada em segmentos de memória não otimizada.
  • Uma indicação aproximada da eficiência geral das alocações de memória colocadas na memória não otimizada.

Essas informações podem ajudar um aplicativo a manter um conjunto de trabalho razoável.

Usando relatórios de pressão de memória

O relatório de pressão de memória usa a interface IDirect3DQuery9 existente para consultar o dispositivo. Um novo tipo de consulta foi adicionado à enumeração D3DQUERYTYPE .

D3DQUERYTYPE_MEMORYPRESSURE        = 19,

Para usar essa consulta, execute as seguintes etapas:

  1. Chame IDirect3DDevice9Ex::CreateQuery com o sinalizador D3DQUERYTYPE_MEMORYPRESSURE . Esse método retorna um ponteiro para a interface IDirect3DQuery9 .
  2. Chame IDirect3DQuery9::Issue com o sinalizador D3DISSUE_BEGIN para iniciar o intervalo de medição.
  3. Chame IDirect3DQuery9::Issue com o sinalizador D3DISSUE_END .
  4. Chame IDirect3DQuery9::GetData para obter o resultado da consulta. A consulta retorna uma estrutura D3DMEMORYPRESSURE .

Código de exemplo

O exemplo a seguir mostra duas funções que medem a pressão de memória. O primeiro inicia o intervalo de medida e o segundo recupera os resultados da medida.

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;
}

APIs de vídeo direct3D