Поделиться через


Перечисление D3DSWAPEFFECT

Определяет эффекты подкачки.

Синтаксис

typedef enum D3DSWAPEFFECT { 
  D3DSWAPEFFECT_DISCARD      = 1,
  D3DSWAPEFFECT_FLIP         = 2,
  D3DSWAPEFFECT_COPY         = 3,
  D3DSWAPEFFECT_OVERLAY      = 4,
  D3DSWAPEFFECT_FLIPEX       = 5,
  D3DSWAPEFFECT_FORCE_DWORD  = 0xFFFFFFFF
} D3DSWAPEFFECT, *LPD3DSWAPEFFECT;

Константы

D3DSWAPEFFECT_DISCARD

При создании цепочки буферов с эффектом подкачки D3DSWAPEFFECT_FLIP или D3DSWAPEFFECT_COPY среда выполнения гарантирует, что операция IDirect3Device9::P resent не повлияет на содержимое каких-либо задних буферов. К сожалению, выполнение этой гарантии может привести к значительным затратам на видеопамять или обработке, особенно при реализации семантики переворачивания для цепочки буферов с окном или семантики копирования для полноэкранной цепочки буферов. Приложение может использовать D3DSWAPEFFECT_DISCARD эффект переключения, чтобы избежать этих накладных расходов и позволить драйверу дисплея выбрать наиболее эффективный метод представления для цепочки буферов. Это также единственный эффект переключения, который можно использовать при указании значения, отличного от D3DMULTISAMPLE_NONE для элемента MultiSampleType D3DPRESENT_PARAMETERS.

Как и цепочка буферов, использующая D3DSWAPEFFECT_FLIP, цепочка буферов, использующая D3DSWAPEFFECT_DISCARD, может содержать несколько задних буферов, к любому из которых можно получить доступ с помощью IDirect3DDevice9::GetBackBuffer или IDirect3DSwapChain9::GetBackBuffer. Цепочку буферов лучше всего рассматривать как очередь, в которой 0 всегда индексирует задний буфер, который будет отображаться в следующей операции Present и из которого буферы удаляются при отображении.

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

D3DSWAPEFFECT_FLIP

Цепочка буферов может включать несколько задних буферов и лучше всего ее использовать в виде круговой очереди, включающей передний буфер. В этой очереди задние буферы всегда нумеруются последовательно от 0 до (n – 1), где n — это число задних буферов, поэтому 0 обозначает последний буфер. При вызове Метода Present очередь "поворачивается" таким образом, что передний буфер становится обратным буфером (n - 1), а задний буфер 0 становится новым передним буфером.

D3DSWAPEFFECT_COPY

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

Для полноэкранной цепочки буферов среда выполнения использует сочетание операций переключения и операций копирования, поддерживаемых при необходимости скрытыми задними буферами, для выполнения операции Present. Соответственно, презентация синхронизируется с вертикальным откатом видеоадаптера, и ее скорость ограничивается выбранным интервалом представления. Единственным исключением является цепочка буферов, указанная с флагом D3DPRESENT_INTERVAL_IMMEDIATE. (См. описание элемента PresentationIntervalsструктуры D3DPRESENT_PARAMETERS .) В этом случае операция Present копирует содержимое обратного буфера непосредственно в передний буфер, не дожидаясь вертикального отката.

D3DSWAPEFFECT_OVERLAY

Используйте выделенную область видеопамяти, которую можно наложить на основную поверхность. Копирование при отображении наложения не выполняется. Операция наложения выполняется на оборудовании без изменения данных в основной поверхности.

Различия между Direct3D 9 и Direct3D 9Ex:

  • D3DSWAPEFFECT_OVERLAY доступна только в Direct3D9Ex, работающей в Windows 7 (или более текущей операционной системе).

D3DSWAPEFFECT_FLIPEX

Указывает, когда приложение принимает режим flip, в течение которого кадр приложения передается вместо копирования в диспетчер окон рабочего стола (DWM) для композиции, когда приложение представлено в оконном режиме. Режим flip позволяет приложению более эффективно использовать пропускную способность памяти, а также позволяет приложению использовать преимущества полноэкранной статистики представления. Режим перелистывания не влияет на поведение в полноэкранном режиме.

Примечание

При создании цепочки буферов с D3DSWAPEFFECT_FLIPEX невозможно переопределить элемент hDeviceWindow структуры D3DPRESENT_PARAMETERS при отображении нового кадра. То есть необходимо передать значение NULL параметру hDestWindowOverrideобъекта IDirect3DeviceEx::P resentEx , чтобы указать среде выполнения использовать член hDeviceWindowD3DPRESENT_PARAMETERS для презентации.

Различия между Direct3D 9 и Direct3D 9Ex:

  • D3DSWAPEFFECT_FLIPEX доступна только в Direct3D9Ex, работающей в Windows 7 (или более текущей операционной системе).

D3DSWAPEFFECT_FORCE_DWORD

Принудительно компилирует это перечисление до 32 бит в размере. Без этого значения некоторые компиляторы разрешали бы компиляцию этого перечисления до размера, отличного от 32 бит. Это значение не используется.

Комментарии

Состояние заднего буфера после вызова Present хорошо определяется каждым из этих эффектов переключения, и то, было ли устройство Direct3D создано с полноэкранной цепочкой буферов или цепочкой буферов с окном, не влияет на это состояние. В частности, эффект D3DSWAPEFFECT_FLIP подкачки действует одинаково как в оконном режиме, так и в полноэкранном режиме, и среда выполнения Direct3D гарантирует это, создавая дополнительные буферы. Поэтому рекомендуется, чтобы приложения по возможности использовали D3DSWAPEFFECT_DISCARD, чтобы избежать таких штрафов. Это связано с тем, что этот эффект переключения всегда будет наиболее эффективным с точки зрения потребления памяти и производительности.

Приложения, использующие D3DSWAPEFFECT_FLIP или D3DSWAPEFFECT_DISCARD, не должны ожидать, что полноэкранный конечный альфа-канал будет работать. Это означает, что состояние отрисовки D3DRS_DESTBLEND не будет работать должным образом, так как полноэкранные цепочки буферов с этими эффектами переключения не имеют явного формата пикселей с точки зрения драйвера. Драйвер указывает, что он должен принимать формат отображения, который не имеет альфа-канала. Чтобы обойти эту проблему, сделайте следующее:

  • Используйте D3DSWAPEFFECT_COPY.
  • Проверьте флаг D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD в элементе Caps3 структуры D3DCAPS9 . Этот флаг указывает, может ли драйвер выполнять альфа-наложение при использовании D3DSWAPEFFECT_FLIP или D3DSWAPEFFECT_DISCARD.
  • Приложения, использующие эффект переключения в режиме переключения (D3DSWAPEFFECT_FLIPEX), должны вызывать PresentEx после изменения размера окна или изменения региона, чтобы обеспечить обновление отображаемого содержимого.

Невидимое окно не может принимать события пользовательского режима; кроме того, невидимое полноэкранное окно будет мешать представлению окна в оконном режиме другого приложения. Поэтому каждое приложение должно убедиться, что окно устройства отображается при отображении цепочки подкачки в полноэкранном режиме.

Требования

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

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

Перечисления Direct3D

IDirect3DDevice9::Reset