Синхронизация между DWM и окном Direct3D

Что произойдет, если приложение находится в процессе рисования в буфере (поверхность d3d), а DWM требуется буфер для перерисовки экрана или наоборот?

Есть ли механизм синхронизации?


person alice    schedule 16.01.2014    source источник


Ответы (1)


Цепочки подкачки всегда имеют два или более буфера, и в любой конкретный момент DWM владеет одним из них. Если новый кадр не был Present() отмечен приложением к моменту появления v-blank, DWM перерисовывает последний кадр, используя уже имеющийся буфер. Синхронизация может быть достигнута путем насыщения текущей очереди (примерно после 3 вызовов следующая будет заблокирована до v-blank) или путем ручного вызова WaitForVBlank. В Windows 8.1 доступен более надежный механизм с использованием IDXGISwapChain2 :: GetFrameLatencyWaitableObject. Невозможно заставить DWM ждать приложения, поскольку это приведет к зависанию всего пользовательского интерфейса ОС.

person MooseBoys    schedule 16.01.2014
comment
После публикации вопроса я еще немного погуглил и нашел это и это сообщение. Они говорят, что окно может быть визуализировано DWM в процессе его обновления, поэтому может произойти структурный разрыв. Это относится только к некоторым старым версиям Windows? - person alice; 17.01.2014
comment
@alice Похоже, что обе эти ссылки признают структурный разрыв как Представление в середине рендеринга, например DrawTriangle(); Present(); DrawRect(); Очевидно, что если намерение состояло в том, чтобы и треугольник, и прямоугольник появлялись одновременно, этот шаблон вызова не произвел бы нужного эффекта. Но это просто плохая логика приложения. - person MooseBoys; 17.01.2014