Compartir a través de


Informes de presión de memoria

Los informes de presión de memoria permiten a una aplicación Direct3D determinar cuándo su conjunto de trabajo de memoria de vídeo ha crecido demasiado grande.

La presión de memoria es la demanda colocada en el subsistema de memoria por una aplicación. Aunque cualquier aplicación de Direct3D puede usar informes de presión de memoria, esta característica es especialmente útil para las aplicaciones que representan vídeo mediante Direct3D. La reproducción de vídeo suele beneficiarse de grandes cantidades de almacenamiento en búfer, de modo que los fotogramas se puedan descodificar de antemano. Aunque el almacenamiento en búfer suele dar lugar a una reproducción más fluida, puede degradar el rendimiento si el conjunto de trabajo crece demasiado grande, debido a los siguientes factores:

  • Es posible que la memoria se expulse de la memoria caché. En el peor de los casos, esto puede ocurrir en cada fotograma de vídeo.
  • Las asignaciones de memoria se pueden colocar en segmentos de memoria no óptimos.

A partir de Windows 7, Direct3D puede informar de algunas estadísticas sobre la presión de memoria de vídeo:

  • Número de bytes expulsados por el proceso durante un intervalo de tiempo.
  • Cantidad de memoria colocada en segmentos de memoria no óptimos.
  • Una indicación aproximada de la eficacia general de las asignaciones de memoria colocadas en memoria no óptima.

Esta información puede ayudar a una aplicación a mantener un conjunto de trabajo razonable.

Uso de informes de presión de memoria

Los informes de presión de memoria usan la interfaz IDirect3DQuery9 existente para consultar el dispositivo. Se ha agregado un nuevo tipo de consulta a la enumeración D3DQUERYTYPE .

D3DQUERYTYPE_MEMORYPRESSURE        = 19,

Para usar esta consulta, realice los pasos siguientes:

  1. Llame a IDirect3DDevice9Ex::CreateQuery con la marca D3DQUERYTYPE_MEMORYPRESSURE . Este método devuelve un puntero a la interfaz IDirect3DQuery9 .
  2. Llame a IDirect3DQuery9::Issue con la marca D3DISSUE_BEGIN para comenzar el intervalo de medición.
  3. Llame a IDirect3DQuery9::Issue con la marca D3DISSUE_END .
  4. Llame a IDirect3DQuery9::GetData para obtener el resultado de la consulta. La consulta devuelve una estructura D3DMEMORYPRESSURE .

Código de ejemplo

En el ejemplo siguiente se muestran dos funciones que miden la presión de memoria. La primera comienza el intervalo de medición y la segunda recupera los resultados de la medida.

HRESULT BeginMemoryPressureQuery(
    IDirect3DDevice9Ex *pDevice, 
    IDirect3DQuery9 **ppQuery
    )
{
    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;
}

API de vídeo de Direct3D