메모리 압력 보고

메모리 압력 보고를 사용하면 Direct3D 애플리케이션에서 비디오 메모리 작업 세트가 너무 커진 시기를 확인할 수 있습니다.

메모리 압력 은 애플리케이션의 메모리 하위 시스템에 대한 요구 사항입니다. 모든 Direct3D 애플리케이션에서 메모리 압력 보고를 사용할 수 있지만 이 기능은 Direct3D를 사용하여 비디오를 렌더링하는 애플리케이션에 특히 유용합니다. 비디오 재생은 일반적으로 많은 양의 버퍼링의 이점을 활용하므로 프레임을 미리 디코딩할 수 있습니다. 버퍼링하면 일반적으로 더 원활한 재생이 발생하지만, 작업 집합이 너무 커지면 실제로 성능이 저하되어 다음과 같은 요인이 발생할 수 있습니다.

  • 메모리가 캐시에서 제거될 수 있습니다. 최악의 경우 모든 비디오 프레임에서 발생할 수 있습니다.
  • 메모리 할당은 최적이 아닌 메모리 세그먼트에 배치될 수 있습니다.

Windows 7부터 Direct3D는 비디오 메모리 압력에 대한 몇 가지 통계를 보고할 수 있습니다.

  • 시간 간격 동안 프로세스에서 제거된 바이트 수입니다.
  • 최적이 아닌 메모리 세그먼트에 배치된 메모리 양입니다.
  • 최적이 아닌 메모리에 배치된 메모리 할당의 전반적인 효율성을 대략적인 표시입니다.

이 정보는 애플리케이션이 적절한 작업 집합을 유지하는 데 도움이 될 수 있습니다.

메모리 압력 보고 사용

메모리 압력 보고는 기존 IDirect3DQuery9 인터페이스를 사용하여 디바이스를 쿼리합니다. D3DQUERYTYPE 열거형에 새 쿼리 형식이 추가되었습니다.

D3DQUERYTYPE_MEMORYPRESSURE        = 19,

이 쿼리를 사용하려면 다음 단계를 수행합니다.

  1. D3DQUERYTYPE_MEMORYPRESSURE 플래그를 사용하여 IDirect3DDevice9Ex::CreateQuery를 호출합니다. 이 메서드는 IDirect3DQuery9 인터페이스에 대한 포인터를 반환합니다.
  2. D3DISSUE_BEGIN 플래그와 함께 IDirect3DQuery9::Issue를 호출하여 측정 간격을 시작합니다.
  3. D3DISSUE_END 플래그를 사용하여 IDirect3DQuery9::Issue를 호출합니다.
  4. IDirect3DQuery9::GetData를 호출하여 쿼리 결과를 가져옵니다. 쿼리는 D3DMEMORYPRESSURE 구조를 반환합니다.

코드 예

다음 예제에서는 메모리 압력을 측정하는 두 가지 함수를 보여 줍니다. 첫 번째는 측정 간격을 시작하고 두 번째는 측정 결과를 검색합니다.

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 비디오 API