Rapports sur la pression de la mémoire

Les rapports de pression de la mémoire permettent à une application Direct3D de déterminer quand son jeu de travail de la mémoire vidéo est devenu trop grand.

La pression de la mémoire est la demande imposée au sous-système de mémoire par une application. Bien que n’importe quelle application Direct3D puisse utiliser le rapport de pression de la mémoire, cette fonctionnalité est particulièrement utile pour les applications qui restituent des vidéos à l’aide de Direct3D. La lecture vidéo bénéficie généralement de grandes quantités de mise en mémoire tampon, de sorte que les images peuvent être décodées à l’avance. Bien que la mise en mémoire tampon entraîne généralement une lecture plus fluide, elle peut en fait dégrader les performances si le jeu de travail devient trop volumineux, en raison des facteurs suivants :

  • La mémoire peut être supprimée du cache. Dans le pire des cas, cela peut se produire sur chaque image vidéo.
  • Les allocations de mémoire peuvent être placées dans des segments de mémoire non optimaux.

À compter de Windows 7, Direct3D peut signaler des statistiques sur la pression de la mémoire vidéo :

  • Nombre d’octets supprimés par le processus sur un intervalle de temps.
  • Quantité de mémoire placée dans des segments de mémoire non optimaux.
  • Une indication approximative de l’efficacité globale des allocations de mémoire placées dans la mémoire non optimale.

Ces informations peuvent aider une application à maintenir un ensemble de travail raisonnable.

Utilisation des rapports de pression de la mémoire

Les rapports de sollicitation de la mémoire utilisent l’interface IDirect3DQuery9 existante pour interroger l’appareil. Un nouveau type de requête a été ajouté à l’énumération D3DQUERYTYPE .

D3DQUERYTYPE_MEMORYPRESSURE        = 19,

Pour utiliser cette requête, procédez comme suit :

  1. Appelez IDirect3DDevice9Ex::CreateQuery avec l’indicateur D3DQUERYTYPE_MEMORYPRESSURE . Cette méthode retourne un pointeur vers l’interface IDirect3DQuery9 .
  2. Appelez IDirect3DQuery9::Issue avec l’indicateur D3DISSUE_BEGIN pour commencer l’intervalle de mesure.
  3. Appelez IDirect3DQuery9::Problème avec l’indicateur D3DISSUE_END .
  4. Appelez IDirect3DQuery9::GetData pour obtenir le résultat de la requête. La requête retourne une structure D3DMEMORYPRESSURE .

Exemple de code

L’exemple suivant montre deux fonctions qui mesurent la pression de la mémoire. Le premier commence l’intervalle de mesure et le second récupère les résultats de la mesure.

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 vidéo Direct3D