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:
- Chame IDirect3DDevice9Ex::CreateQuery com o sinalizador D3DQUERYTYPE_MEMORYPRESSURE . Esse método retorna um ponteiro para a interface IDirect3DQuery9 .
- Chame IDirect3DQuery9::Issue com o sinalizador D3DISSUE_BEGIN para iniciar o intervalo de medição.
- Chame IDirect3DQuery9::Issue com o sinalizador D3DISSUE_END .
- 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;
}
Tópicos relacionados