Ранее, когда я создавал инструменты, я использовал D3D версии 9, где вызов Present () может принимать целевое окно и прямоугольник, и таким образом вы можете рисовать с одного устройства во множество разных окон.Это замечательно, когда используется D3D для ускорения настольных приложений и / или создания инструментов, а не игр!
Ранее я также создавал игровой рендер с D3D11, что также здорово, потому что интерфейсы управления состоянием и потоковхорошо спроектированы, и вы даже можете использовать аппаратное обеспечение уровня D3D 9, которое все еще довольно распространено в дикой природе (в отличие от D3D 10, который может быть ориентирован только на 10 и более).
Однако теперь я хочусобрать инструмент с D3D11.К сожалению, IDXGISwapChain, который возвращается из D3D11CreateDeviceAndSwapChain (), кажется, «запоминает» свой HWND и хочет только представить это окно.Это очень неудобно, потому что у меня может быть большое количество окон, каждое из которых нуждается в довольно простой графике, нарисованной на них, и только в ответ на WM_PAINT (опять же, это для инструмента, а не игры).
Что я хочу сделать, это сохранить обратно буферный ОЗУВ частности, я имел обыкновение создавать единый резервный буфер размером с рабочий стол, который, как я знал, мог покрыть все потребности рендеринга, и тогда это была бы выделенная копия.Даже если имеется 10 перекрывающихся окон, все они рендерится через один и тот же задний буфер, так что нет никакой потери памяти после первоначального выделения.Я могу создавать текстуры, которые не являются цепочками обмена, и использовать их в качестве «целей рендеринга», но я не могу найти хороший способ представления произвольного прямоугольника произвольного окна клиента, не считывая растровое изображение и не копируя его вDIBSection, который был бы действительно неэффективным.Кроме того, невозможно создать много цепочек подкачки, и они будут использовать один и тот же резервный буфер.
Лучшее, что я могу сделать, - это создать одну цепочку подкачки на окно и изменить размер обратного буфера каждой цепочки подкачки.быть очень маленьким, за исключением случаев, когда я рендерим в цепочку подкачки, после чего я изменяю ее размер, чтобы соответствовать окну.Однако это кажется неэффективным, потому что изменение размера целей не является «свободной» операцией AFAICT.Так есть ли лучший способ?