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