Структура D3DPRESENTSTATS

Описывает статистику цепочки буферов, относящуюся к вызовам PresentEx .

Синтаксис

typedef struct _D3DPRESENTSTATS {
  UINT          PresentCount;
  UINT          PresentRefreshCount;
  UINT          SyncRefreshCount;
  LARGE_INTEGER SyncQPCTime;
  LARGE_INTEGER SyncGPUTime;
} D3DPRESENTSTATS;

Члены

PresentCount

Тип: UINT

Количество успешных вызовов Present, выполненных устройством отображения, которое в настоящее время выводится на экран. Этот параметр на самом деле является идентификатором Present последнего вызова Present и не обязательно представляет собой общее количество вызовов API Present.

PresentRefreshCount

Тип: UINT

Число vblank, при котором на экране отображалось последнее present, число vblank увеличивается один раз с каждым интервалом vblank.

SyncRefreshCount

Тип: UINT

Число vblank, когда планировщик в последний раз отбирал выборку времени компьютера путем вызова QueryPerformanceCounter.

SyncQPCTime

Тип: LARGE_INTEGER

Последнее выборочное машинное время планировщика, полученное путем вызова QueryPerformanceCounter.

SyncGPUTime

Тип: LARGE_INTEGER

Это значение не используется.

Комментарии

Когда приложение 9Ex использует режим flip present (D3DSWAPEFFECT_FLIPEX), приложения могут обнаружить удаление кадра, вызвав Метод GetPresentStatistics в любой момент времени. По сути, они могут выполнять следующие действия.

  1. Отрисовка в задний буфер
  2. Вызов присутствоть
  3. Вызовите GetPresentStats и сохраните полученную структуру D3DPRESENTSTATS.
  4. Отрисовка следующего кадра в заднем буфере
  5. Вызов присутствоть
  6. Повторите шаги 4 и 5 один или несколько раз
  7. Вызовите GetPresentStats и сохраните полученную структуру D3DPRESENTSTATS.
  8. Сравните значения PresentRefreshCount из двух хранимых структур D3DPRESENTSTATS. Приложение может вычислить соответствующий Параметр PresentRefreshCount определенного параметра PresentCount на основе допущений приращения PresentRefreshCount и назначения PresentCount представления кадра. Если последняя выборка PresentRefreshCount не соответствует PresentCount (т. е. если Параметр PresentRefreshCount увеличился, а PresentCount — нет, то кадр был удален).

Приложения могут определить, был ли удален кадр, путем выборки любых двух экземпляров PresentCount и GetPresentStats (путем вызова API GetPresentStats в любой момент времени). Например, приложение мультимедиа, которое отображается с той же скоростью, что и частота обновления монитора (например, частота обновления монитора составляет 60 Гц, приложение представляет кадр каждые 1/60 секунд), хочет представить кадры A, B, C, D, E, каждый из которых соответствует идентификаторам Present (PresentCount) 1, 2, 3, 7, 8.

Код приложения выглядит следующим образом.

  1. Отрисовка кадра A в задний буфер
  2. Вызов Present, PresentCount = 1
  3. Вызовите GetPresentStats и сохраните полученную структуру D3DPRESENTSTATS.
  4. Отрисовка следующих 4 кадров: B, C, D, E соответственно
  5. Вызовите Present 4 раза, PresentCounts = 2, 3, 7, 8, соответственно
  6. Вызовите GetPresentStats и сохраните полученную структуру D3DPRESENTSTATS.
  7. Сравните значения PresentRefreshCount из двух хранимых структур D3DPRESENTSTATS. Если разница составляет 2, т. е. между двумя вызовами API GetPresentStats прошло 2 интервала vblank, то последним представленным кадром должен быть кадр C. Так как приложение предоставляет один раз очень интервал vblank (частота обновления монитора), время, прошедшее между представлением кадра A и представлением кадра C, должно составлять 2 виртуальных блянка.
  8. Сравните значения PresentCount из двух хранимых структур D3DPRESENTSTATS. Если первый параметр PresentCount равен 1 (соответствует кадру A), а второй — 3 (соответствует кадру C), то кадры не были удалены. Если второе значение PresentCount равно 3, что соответствует кадру D, приложение знает, что один кадр был удален.

Обратите внимание, что GetPresentStatistics будет обрабатываться после вызова, независимо от состояния вызовов PresentEx в режиме FLIPEX.

Windows Vista: Вызовы Present будут поставлены в очередь, а затем обработаны перед обработкой вызова GetPresentStats.

Когда приложение обнаруживает, что представление определенных кадров позади, оно может пропустить эти кадры и исправить презентацию для повторной синхронизации с vblank. Для этого приложение может просто не отображать последние кадры и начать отрисовку со следующим правильным кадром в очереди. Однако если приложение уже начало отрисовку поздних кадров, оно может использовать новый параметр Present в D3D9Ex с именем D3DPRESENT_FORCEIMMEDIATE. Флаг передается в параметрах вызова API Present и указывает среде выполнения, что кадр будет обрабатываться непосредственно в течение следующего интервала vblank, фактически невидимым на экране. Ниже приведен пример использования приложения после последнего шага в предыдущем примере.

  1. Отрисовка следующего кадра в заднем буфере
  2. Узнайте из PresentRefreshCount, что следующий кадр уже запаздывал
  3. Задайте для параметра Интервал представления значение D3DPRESENT_FORCEIMMEDIATE
  4. Вызов present для следующего кадра

Приложения могут синхронизировать видео- и аудиопотоки одинаково, так как поведение GetPresentStatistics не меняется в этом сценарии.

Режим перелистывания D3D9Ex предоставляет сведения о статистике кадров для оконных приложений и полноэкранных приложений 9Ex.

Windows Vista: Используйте API DWM для получения текущей статистики.

Если диспетчер окон на рабочем столе выключен, приложения с оконным режимом 9Ex, использующие режим flip, будут получать статистические данные с ограниченной точностью.

Windows Vista:

Если приложение недостаточно быстро, чтобы идти в ногу с частотой обновления монитора, возможно, из-за медленного оборудования или отсутствия системных ресурсов, оно может столкнуться с графическим сбоем. Сбой — это так называемая визуальная икота. Если монитор обновляется с частотой 60 Гц и приложение может управлять только 30 кадрами в минуту, то половина кадров будет иметь сбои.

Приложения могут обнаружить сбой, отслеживая SynchRefreshCount. Например, приложение может выполнять следующую последовательность действий.

  1. Отрисовка в обратном буфере.
  2. Вызовите Present.
  3. Вызовите GetPresentStats и сохраните полученную структуру D3DPRESENTSTATS.
  4. Отрисовка следующего кадра в заднем буфере.
  5. Вызовите Present.
  6. Вызовите GetPresentStats и сохраните полученную структуру D3DPRESENTSTATS.
  7. Сравните значения SyncRefreshCount из двух хранимых структур D3DPRESENTSTATS. Если разница больше единицы, кадр был пропущен.

Требования

Требование Значение
Заголовок
D3d9types.h

См. также раздел

Структуры Direct3D