Berichterstellung für Arbeitsspeicherdruck

Mit der Berichterstellung über den Arbeitsspeicher kann eine Direct3D-Anwendung ermitteln, wann ihr Video-Arbeitsspeicher-Arbeitssatz zu groß geworden ist.

Arbeitsspeicherdruck ist die Anforderung, die von einer Anwendung an das Speichersubsystem gestellt wird. Während jede Direct3D-Anwendung die Berichterstellung für den Speicherdruck verwenden kann, ist dieses Feature besonders nützlich für Anwendungen, die Videos mithilfe von Direct3D rendern. Die Videowiedergabe profitiert in der Regel von großen Mengen an Pufferung, sodass Frames im Voraus decodiert werden können. Das Puffern führt zwar im Allgemeinen zu einer reibungsloseren Wiedergabe, kann jedoch die Leistung beeinträchtigen, wenn der Arbeitssatz aufgrund der folgenden Faktoren zu groß wird:

  • Speicher kann aus dem Cache entfernt werden. Im schlimmsten Fall kann dies bei jedem Videoframe auftreten.
  • Speicherzuordnungen können in nicht optimalen Speichersegmenten platziert werden.

Ab Windows 7 kann Direct3D einige Statistiken über den Druck des Videospeichers melden:

  • Die Anzahl der Bytes, die der Prozess über ein Intervall hinweg entfernt hat.
  • Die Menge an Arbeitsspeicher, die in nicht optimalen Speichersegmenten platziert wird.
  • Ein grober Hinweis auf die Gesamteffizienz der Speicherbelegungen, die im nicht optimalen Speicher platziert werden.

Diese Informationen können einer Anwendung helfen, einen angemessenen Arbeitssatz beizubehalten.

Verwenden von Speicherdruckberichten

Die Berichterstellung zum Arbeitsspeicherdruck verwendet die vorhandene IDirect3DQuery9-Schnittstelle , um das Gerät abzufragen. Der D3DQUERYTYPE-Enumeration wurde ein neuer Abfragetyp hinzugefügt.

D3DQUERYTYPE_MEMORYPRESSURE        = 19,

Führen Sie zum Verwenden dieser Abfrage die folgenden Schritte aus:

  1. Rufen Sie IDirect3DDevice9Ex::CreateQuery mit dem flag D3DQUERYTYPE_MEMORYPRESSURE auf. Diese Methode gibt einen Zeiger auf die IDirect3DQuery9-Schnittstelle zurück.
  2. Rufen Sie IDirect3DQuery9:::Issue with the D3DISSUE_BEGIN Flag auf, um das Messintervall zu beginnen.
  3. Rufen Sie IDirect3DQuery9::Problem mit dem D3DISSUE_END-Flag auf.
  4. Rufen Sie IDirect3DQuery9::GetData auf, um das Abfrageergebnis abzurufen. Die Abfrage gibt eine D3DMEMORYPRESSURE-Struktur zurück.

Beispielcode

Das folgende Beispiel zeigt zwei Funktionen, die den Arbeitsspeicherdruck messen. Die erste beginnt mit dem Messintervall, und die zweite ruft die Ergebnisse der Messung ab.

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

Direct3D-Video-APIs