Как представить в другое окно, используя IDXGISwapChain и ID3D11Device / ID3D11DeviceContext? - PullRequest
3 голосов
/ 25 августа 2011

Ранее, когда я создавал инструменты, я использовал D3D версии 9, где вызов Present () может принимать целевое окно и прямоугольник, и таким образом вы можете рисовать с одного устройства во множество разных окон.Это замечательно, когда используется D3D для ускорения настольных приложений и / или создания инструментов, а не игр!

Ранее я также создавал игровой рендер с D3D11, что также здорово, потому что интерфейсы управления состоянием и потоковхорошо спроектированы, и вы даже можете использовать аппаратное обеспечение уровня D3D 9, которое все еще довольно распространено в дикой природе (в отличие от D3D 10, который может быть ориентирован только на 10 и более).

Однако теперь я хочусобрать инструмент с D3D11.К сожалению, IDXGISwapChain, который возвращается из D3D11CreateDeviceAndSwapChain (), кажется, «запоминает» свой HWND и хочет только представить это окно.Это очень неудобно, потому что у меня может быть большое количество окон, каждое из которых нуждается в довольно простой графике, нарисованной на них, и только в ответ на WM_PAINT (опять же, это для инструмента, а не игры).

Что я хочу сделать, это сохранить обратно буферный ОЗУВ частности, я имел обыкновение создавать единый резервный буфер размером с рабочий стол, который, как я знал, мог покрыть все потребности рендеринга, и тогда это была бы выделенная копия.Даже если имеется 10 перекрывающихся окон, все они рендерится через один и тот же задний буфер, так что нет никакой потери памяти после первоначального выделения.Я могу создавать текстуры, которые не являются цепочками обмена, и использовать их в качестве «целей рендеринга», но я не могу найти хороший способ представления произвольного прямоугольника произвольного окна клиента, не считывая растровое изображение и не копируя его вDIBSection, который был бы действительно неэффективным.Кроме того, невозможно создать много цепочек подкачки, и они будут использовать один и тот же резервный буфер.

Лучшее, что я могу сделать, - это создать одну цепочку подкачки на окно и изменить размер обратного буфера каждой цепочки подкачки.быть очень маленьким, за исключением случаев, когда я рендерим в цепочку подкачки, после чего я изменяю ее размер, чтобы соответствовать окну.Однако это кажется неэффективным, потому что изменение размера целей не является «свободной» операцией AFAICT.Так есть ли лучший способ?

1 Ответ

1 голос
/ 31 октября 2011

Ответ, который я получил в итоге, состоял в том, чтобы создать один резервный буфер на отдельную область отображения, а не увеличивать его размер до заднего буфера. Я полагаю, что в мире, где композиция и прозрачность рабочего стола могут с радостью "что-нибудь" за моей спиной, это, вероятно, полезно для системы. Учитесь любить систему VVM, я думаю :-) (VVM для виртуальной видеопамяти)

...