:material-chevron-right-circle: vkCmdBeginQuery
函数原型
void vkCmdBeginQuery(
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t query,
VkQueryControlFlags flags);
描述
开始查询操作。
参数
commandBuffer
: 录制指令的命令缓冲区。queryPool
: 管理查询结果的查询池。query
: 在查询池中的索引。flags
:VkQueryControlFlagBits
的掩码,指定查询的约束。
补充
VkQueryControlFlagBits
枚举定义:
typedef enum VkQueryControlFlagBits {
VK_QUERY_CONTROL_PRECISE_BIT = 0x00000001,
} VkQueryControlFlagBits;
VK_QUERY_CONTROL_PRECISE_BIT
: 指定occlusion query(遮挡查询)结果的精度-
启用时(PRECISE_BIT):查询结果保证精确,但可能会降低性能。
-
禁用时(默认):查询结果可能是近似值,但性能更高。
适用场景:当需要准确的像素通过数(例如精确的遮挡剔除、性能分析)时启用。
-
返回值
无
代码示例
VkQueryPoolCreateInfo queryPoolInfo = {};
queryPoolInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
queryPoolInfo.queryType = VK_QUERY_TYPE_OCCLUSION; // 遮挡查询类型
queryPoolInfo.queryCount = 1;
// 启用 PRECISE_BIT
queryPoolInfo.flags = VK_QUERY_CONTROL_PRECISE_BIT;
VkQueryPool queryPool;
vkCreateQueryPool(device, &queryPoolInfo, nullptr, &queryPool);
vkCmdBeginQuery(
commandBuffer,
queryPool,
0, // 查询索引
VK_QUERY_CONTROL_PRECISE_BIT // 启用精确查询
);
// 绘制需要测试的几何体
vkCmdDrawIndexed(commandBuffer, ...);
vkCmdEndQuery(commandBuffer, queryPool, 0);
// 获取查询结果
uint64_t result;
vkGetQueryPoolResults(
device,
queryPool,
0, 1, sizeof(uint64_t),
&result, sizeof(uint64_t),
VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT
);