메모리 압력 보고
메모리 압력 보고를 사용하면 Direct3D 애플리케이션에서 비디오 메모리 작업 세트가 너무 커진 시기를 확인할 수 있습니다.
메모리 압력 은 애플리케이션의 메모리 하위 시스템에 대한 요구 사항입니다. 모든 Direct3D 애플리케이션에서 메모리 압력 보고를 사용할 수 있지만 이 기능은 Direct3D를 사용하여 비디오를 렌더링하는 애플리케이션에 특히 유용합니다. 비디오 재생은 일반적으로 많은 양의 버퍼링의 이점을 활용하므로 프레임을 미리 디코딩할 수 있습니다. 버퍼링하면 일반적으로 더 원활한 재생이 발생하지만, 작업 집합이 너무 커지면 실제로 성능이 저하되어 다음과 같은 요인이 발생할 수 있습니다.
- 메모리가 캐시에서 제거될 수 있습니다. 최악의 경우 모든 비디오 프레임에서 발생할 수 있습니다.
- 메모리 할당은 최적이 아닌 메모리 세그먼트에 배치될 수 있습니다.
Windows 7부터 Direct3D는 비디오 메모리 압력에 대한 몇 가지 통계를 보고할 수 있습니다.
- 시간 간격 동안 프로세스에서 제거된 바이트 수입니다.
- 최적이 아닌 메모리 세그먼트에 배치된 메모리 양입니다.
- 최적이 아닌 메모리에 배치된 메모리 할당의 전반적인 효율성을 대략적인 표시입니다.
이 정보는 애플리케이션이 적절한 작업 집합을 유지하는 데 도움이 될 수 있습니다.
메모리 압력 보고 사용
메모리 압력 보고는 기존 IDirect3DQuery9 인터페이스를 사용하여 디바이스를 쿼리합니다. D3DQUERYTYPE 열거형에 새 쿼리 형식이 추가되었습니다.
D3DQUERYTYPE_MEMORYPRESSURE = 19,
이 쿼리를 사용하려면 다음 단계를 수행합니다.
- D3DQUERYTYPE_MEMORYPRESSURE 플래그를 사용하여 IDirect3DDevice9Ex::CreateQuery를 호출합니다. 이 메서드는 IDirect3DQuery9 인터페이스에 대한 포인터를 반환합니다.
- D3DISSUE_BEGIN 플래그와 함께 IDirect3DQuery9::Issue를 호출하여 측정 간격을 시작합니다.
- D3DISSUE_END 플래그를 사용하여 IDirect3DQuery9::Issue를 호출합니다.
- IDirect3DQuery9::GetData를 호출하여 쿼리 결과를 가져옵니다. 쿼리는 D3DMEMORYPRESSURE 구조를 반환합니다.
코드 예
다음 예제에서는 메모리 압력을 측정하는 두 가지 함수를 보여 줍니다. 첫 번째는 측정 간격을 시작하고 두 번째는 측정 결과를 검색합니다.
HRESULT BeginMemoryPressureQuery(
IDirect3DDevice9Ex *pDevice,
IDirect3DQuery9 **ppQuery
)
{
if (!pDevice || !ppQuery)
return E_POINTER;
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;
}
관련 항목