Переворачивающие поверхности (Direct3D 9)

Приложение Direct3D обычно отображает анимированную последовательность, создавая кадры анимации в задних буферах и представляя их последовательно. Задние буферы организованы в цепочки буферов. Цепочка буферов — это ряд буферов, которые "переворачивающиеся" на экран один за другим. Его можно использовать для отрисовки одной сцены в памяти, а затем перевернуть сцену на экран после завершения отрисовки. Это позволяет избежать явления, известного как разрыв, и обеспечивает более плавную анимацию.

Каждое устройство, созданное в Direct3D, имеет по крайней мере одну цепочку буферов. При инициализации первого устройства Direct3D задается элемент BackBufferCount D3DPRESENT_PARAMETERS, который сообщает Direct3D о количестве задних буферов, которые будут находиться в цепочке буферов. Затем вызов IDirect3D9::CreateDevice создает устройство Direct3D и соответствующую цепочку буферов.

При использовании IDirect3DDevice9::P resent для запроса операции переключения поверхности указатели на поверхностную память для буфера переднего и заднего буферов меняются местами. Пролистывание выполняется путем переключения указателей, которые устройство отображения использует для ссылки на память, а не путем копирования памяти поверхности. Если переворачиваемая цепочка содержит передний буфер и несколько задних буферов, указатели переключаются в циклической схеме, как показано на следующей схеме.

Схема переворачиваемой цепочки с передним буфером и двумя задними буферами

Вы можете создать дополнительные цепочки буферов для устройства, вызвав IDirect3DDevice9::CreateAdditionalSwapChain. Приложение может создать одну цепочку буферов для каждого представления и связать каждую цепочку буферов с определенным окном. Приложение отображает изображения в задних буферах каждой цепочки буферов, а затем представляет их по отдельности. Два параметра, которые принимает IDirect3DDevice9::CreateAdditionalSwapChain , являются указателем на структуру D3DPRESENT_PARAMETERS и адресом интерфейса IDirect3DSwapChain9 . Затем можно использовать IDirect3DSwapChain9::P resent для отображения содержимого следующего обратного буфера в переднем буфере. Обратите внимание, что устройство может иметь только одну полноэкранную цепочку буферов.

Вы можете получить доступ к определенному буферу назад, вызвав методы IDirect3DDevice9::GetBackBuffer или IDirect3DSwapChain9::GetBackBuffer , которые возвращают указатель на интерфейс IDirect3DSurface9 , представляющий возвращенную поверхность обратного буфера. Обратите внимание, что вызов этого метода увеличивает количество внутренних ссылок в интерфейсе IDirect3Device9 , поэтому не забудьте вызвать IUnknown , когда вы закончите использовать эту поверхность, иначе произойдет утечка памяти.

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

Важно отметить различие между операцией "переворачивания", выполняемой драйвером видеоадаптера, и операцией "Презентация", применяемой к цепочке буферов, созданной с помощью D3DSWAPEFFECT_FLIP.

Термин "перевернуть" обычно обозначает операцию, которая изменяет диапазон адресов видеопамяти, которые видеоадаптер использует для создания выходного сигнала, что приводит к отображению содержимого ранее скрытого обратного буфера. В Direct3D 9 термин часто используется более широко для описания представления заднего буфера в любой цепочке буферов, созданной с помощью эффекта D3DSWAPEFFECT_FLIP буфера.

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

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

Более общее описание различных эффектов переключения для оконных и полноэкранных цепочек буферов см. в разделе D3DSWAPEFFECT.

Поверхности Direct3D