Создайте поверхность Vulkan только для части окна

avatar
Gary Allen
12 августа 2021 в 16:49
258
1
0

У нас есть приложение, в котором есть окно с горизонтальной панелью инструментов вверху. Дескриптор уровня окна, который мы передаем Vulkan для создания поверхности, в конечном итоге включает область за панелью инструментов, т. е. Vulkan совершенно не знает о панели инструментов, а поверхность включает пространство «за» ней.

Мой вопрос: может ли поверхность представлять только часть этого окна? Нам, очевидно, не нужно обрабатывать данные для пикселей, которые находятся за панелью инструментов, и поэтому мы хотим избежать создания буфера кадра, буфера глубины и т. д. больше, чем необходимо.

Я полностью понимаю, что могу выполнить это визуально, используя окно просмотра, которое, например. имеет смещение источника и компенсацию высоты, однако, насколько я понимаю, буфер кадра на самом деле все еще содержит информацию о пикселях полного размера поверхности (например, 800x600 для окна клиентской области 800x600), даже если я отображаю только часть этого окна . Затем буфер кадра "сопоставляется" и, следовательно, сжимается в области окна просмотра.

Все это заставило меня задаться вопросом, какова цель области просмотра. Если он просто определяет сопоставление вашего буфера изображения с областью на поверхности, не будет ли это очень неэффективным, если ваш фреймбуфер содержит значительно больше пикселей, чем область, на которую он сопоставляется? Разве не имеет смысла разделять части вашего приложения, например, разные окна HWND ПЕРВЫМИ, а затем создавать разные поверхности?

Как избежать рендеринга в области, превышающей необходимую?

Источник
krOoze
12 августа 2021 в 21:45
1

Дубликат coderhelper.com/questions/68536118/…. Я не совсем понимаю вопрос. Практически определение «окна» в большинстве оконных систем - это атомарная неделимая часть. У вас не может быть поверхности для части окна, потому что «поверхность» — это «окно». Просто другое название одного и того же. Если вы хотите разделить его, то почему бы просто не сделать два окна?

Gary Allen
13 августа 2021 в 09:13
0

@krOoze, вы правы - я действительно неправильно понял несколько вещей, которые теперь мне яснее. Спасибо за помощь!

Ответы (1)

avatar
Nicol Bolas
12 августа 2021 в 22:03
2

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

Именно для этого окна клиента должна быть создана поверхность Vulkan.