Отчеты о нехватке памяти
Отчеты о нехватке памяти позволяют приложению Direct3D определить, когда его рабочий набор видеопамяли стал слишком большим.
Нехватка памяти — это потребность, которую приложение предъявляет к подсистеме памяти. Хотя любое приложение Direct3D может использовать отчеты о нехватке памяти, эта функция особенно полезна для приложений, которые отрисовывает видео с помощью Direct3D. Воспроизведение видео обычно выигрывает от буферизации больших объемов, поэтому кадры можно декодировать заранее. Хотя буферизация обычно приводит к более плавному воспроизведению, это может на самом деле снизить производительность, если рабочий набор становится слишком большим из-за следующих факторов:
- Память может быть исключена из кэша. В худшем случае это может произойти на каждом видеокадре.
- Выделение памяти может размещаться в неоптимальных сегментах памяти.
Начиная с Windows 7 Direct3D может сообщать некоторые статистические данные о нехватке видеопамять:
- Количество байтов, вытеснимых процессом в течение интервала времени.
- Объем памяти, размещенный в неоптимальных сегментах памяти.
- Грубое указание общей эффективности выделения памяти, размещенной в неоптимальной памяти.
Эти сведения могут помочь приложению поддерживать разумный рабочий набор.
Использование отчетов о нехватке памяти
Отчеты о нехватке памяти используют существующий интерфейс IDirect3DQuery9 для запроса устройства. В перечисление D3DQUERYTYPE добавлен новый тип запроса.
D3DQUERYTYPE_MEMORYPRESSURE = 19,
Чтобы использовать этот запрос, выполните следующие действия.
- Вызовите IDirect3DDevice9Ex::CreateQuery с флагом D3DQUERYTYPE_MEMORYPRESSURE . Этот метод возвращает указатель на интерфейс IDirect3DQuery9 .
- Вызовите IDirect3DQuery9::Issue с флагом D3DISSUE_BEGIN , чтобы начать интервал измерения.
- Вызовите IDirect3DQuery9::Issue с флагом D3DISSUE_END .
- Вызовите 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;
}
Связанные темы