c - 仅为窗口的一部分创建 Vulkan 表面
问题描述
我们有一个应用程序,它有一个顶部带有水平工具栏的窗口。我们传递给 Vulkan 以创建表面的窗口级句柄最终包括工具栏后面的区域,即 Vulkan 完全不知道工具栏,表面包括它“后面”的空间。
我的问题是,一个表面可以只代表这个窗口的一部分吗?我们显然不需要为位于工具栏后面的像素处理数据,因此希望避免创建比必要更大的帧缓冲区、深度缓冲区等。
我完全理解我可以使用具有原点偏移和高度补偿的视口在视觉上完成此操作,但是据我了解,帧缓冲区实际上仍然包含表面全尺寸的像素信息(例如 800x600 用于 800x600 客户区域窗口),即使我只渲染到该窗口的一部分。然后帧缓冲区被“映射”并因此被压缩到视口区域。
所有这些都让我想知道视口的用途是什么。如果它只是定义了从图像缓冲区到表面区域的映射,那么如果帧缓冲区包含的像素比它被映射到的区域多得多,那不是非常低效吗?在你的应用程序中使用不同的窗口HWNDs FIRST,然后从那时起创建不同的表面是否没有意义?
如何避免渲染到比需要更大的区域?
解决方案
几乎每个应用程序的处理方式是窗口的客户区(即:不是工具栏等的东西)是主框架窗口的子窗口。当框架调整大小时,您调整客户端窗口的大小以匹配新的客户区(考虑到工具栏/等的新大小)。
正是这个客户端窗口应该有一个为其创建的 Vulkan 表面。
推荐阅读
- mysql - Sql:在 STR_TO_DATE 范围内选择
- spring - 我在邮递员上收到此错误:“状态”:404,“错误”:“未找到”,“消息”:“没有可用消息”,
- c - 到达断点时 gdb 不提供回溯,但在命令文件中指定
- pandas - 根据匹配 ID 创建新列
- c - arduino uno上的多个开关盒问题
- python - Python 正则表达式匹配不包含字符串的行
- javascript - 当鼠标移动状态发生变化时反应样式化组件的低性能
- python - 如何使用堆栈实现将此 BFS 代码转换为 DFS 和 UCS..?
- python-3.x - 如何删除列python最小值之前的两行和之后的两行
- google-cloud-platform - 如何在 Google 数据流中加密一个 zipoutputstream