Отчеты о нехватке памяти

Отчеты о нехватке памяти позволяют приложению Direct3D определить, когда его рабочий набор видеопамяли стал слишком большим.

Нехватка памяти — это потребность, которую приложение предъявляет к подсистеме памяти. Хотя любое приложение Direct3D может использовать отчеты о нехватке памяти, эта функция особенно полезна для приложений, которые отрисовывает видео с помощью Direct3D. Воспроизведение видео обычно выигрывает от буферизации больших объемов, поэтому кадры можно декодировать заранее. Хотя буферизация обычно приводит к более плавному воспроизведению, это может на самом деле снизить производительность, если рабочий набор становится слишком большим из-за следующих факторов:

  • Память может быть исключена из кэша. В худшем случае это может произойти на каждом видеокадре.
  • Выделение памяти может размещаться в неоптимальных сегментах памяти.

Начиная с Windows 7 Direct3D может сообщать некоторые статистические данные о нехватке видеопамять:

  • Количество байтов, вытеснимых процессом в течение интервала времени.
  • Объем памяти, размещенный в неоптимальных сегментах памяти.
  • Грубое указание общей эффективности выделения памяти, размещенной в неоптимальной памяти.

Эти сведения могут помочь приложению поддерживать разумный рабочий набор.

Использование отчетов о нехватке памяти

Отчеты о нехватке памяти используют существующий интерфейс IDirect3DQuery9 для запроса устройства. В перечисление D3DQUERYTYPE добавлен новый тип запроса.

D3DQUERYTYPE_MEMORYPRESSURE        = 19,

Чтобы использовать этот запрос, выполните следующие действия.

  1. Вызовите IDirect3DDevice9Ex::CreateQuery с флагом D3DQUERYTYPE_MEMORYPRESSURE . Этот метод возвращает указатель на интерфейс IDirect3DQuery9 .
  2. Вызовите IDirect3DQuery9::Issue с флагом D3DISSUE_BEGIN , чтобы начать интервал измерения.
  3. Вызовите IDirect3DQuery9::Issue с флагом D3DISSUE_END .
  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;
}

API-интерфейсы Direct3D Video