Condividi tramite


Report sulla pressione della memoria

La segnalazione delle richieste di memoria consente a un'applicazione Direct3D di determinare quando il working set di memoria video è cresciuto troppo grande.

La pressione della memoria è la richiesta inserita nel sottosistema di memoria da un'applicazione. Anche se qualsiasi applicazione Direct3D può usare la segnalazione della pressione della memoria, questa funzionalità è particolarmente utile per le applicazioni che eseguono il rendering di video tramite Direct3D. La riproduzione video in genere trae vantaggio da grandi quantità di buffering, in modo che i fotogrammi possano essere decodificati in anticipo. Mentre il buffering in genere comporta una riproduzione più fluida, può effettivamente ridurre le prestazioni se il working set cresce troppo grande, a causa dei fattori seguenti:

  • La memoria potrebbe essere rimossa dalla cache. Nel peggiore dei casi, questo può verificarsi in ogni fotogramma video.
  • Le allocazioni di memoria potrebbero essere inserite in segmenti di memoria non ottimali.

A partire da Windows 7, Direct3D può segnalare alcune statistiche sulla pressione della memoria video:

  • Numero di byte rimossi dal processo in un intervallo di tempo.
  • Quantità di memoria inserita in segmenti di memoria non ottimali.
  • Indicazione approssimativa dell'efficienza complessiva delle allocazioni di memoria inserite nella memoria non ottimale.

Queste informazioni consentono a un'applicazione di mantenere un working set ragionevole.

Uso di report sulle richieste di memoria

La creazione di report sulla pressione della memoria usa l'interfaccia IDirect3DQuery9 esistente per eseguire query sul dispositivo. È stato aggiunto un nuovo tipo di query all'enumerazione D3DQUERYTYPE .

D3DQUERYTYPE_MEMORYPRESSURE        = 19,

Per usare questa query, seguire questa procedura:

  1. Chiamare IDirect3DDevice9Ex::CreateQuery con il flag D3DQUERYTYPE_MEMORYPRESSURE . Questo metodo restituisce un puntatore all'interfaccia IDirect3DQuery9 .
  2. Chiamare IDirect3DQuery9::Issue con il flag D3DISSUE_BEGIN per iniziare l'intervallo di misurazione.
  3. Chiamare IDirect3DQuery9::Issue con il flag D3DISSUE_END .
  4. Chiamare IDirect3DQuery9::GetData per ottenere il risultato della query. La query restituisce una struttura D3DMEMORYPRESSURE .

Codice di esempio

L'esempio seguente illustra due funzioni che misurano la pressione della memoria. Il primo inizia l'intervallo di misurazione e il secondo recupera i risultati della misurazione.

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 Video Direct3D