我的 Vulkan 程序运行速度极慢,我正试图找出原因。我注意到,即使是一些绘制调用也已经消耗了远远超过应有的性能。例如,这是一个用于渲染一些网格的提取(伪代码):
int32_t numCalls = 0;
int32_t numIndices = 0;
for(auto &mesh : meshes)
{
auto vertexBuffer = mesh.GetVertexBuffer();
auto indexBuffer = mesh.GetIndexBuffer();
vk::DeviceSize offset = 0;
drawCmd.bindVertexBuffers(0,1,&vertexBuffer,&offset); // drawCmd = CommandBuffer for all drawing commands (single thread)
drawCmd.bindIndexBuffer(indexBuffer,offset,vk::IndexType::eUint16);
drawCmd.drawIndexed(mesh.GetIndexCount(),1,0,0,0);
numIndices += mesh.GetIndexCount();
++numCalls;
}
有 238 个网格被渲染,总顶点索引计数为 52050。GPU 绝对不会负担过重(着色器非常便宜)。
如果我使用上面的代码运行我的程序,帧将在大约46ms 内呈现。没有它,它只有9ms。
我正在使用带有 2 个交换链图像的 fifo 呈现模式。此时只有一个主命令缓冲区(没有辅助命令缓冲区/预先记录的缓冲区),所有帧都使用相同的缓冲区。
我的问题是,我真的不知道要寻找什么。这几个渲染调用应该几乎没有影响,所以问题的根源一定在其他地方。
谁能给我任何提示我应该如何解决这个问题?是否已经有 Vulkan 的分析器?我只需要朝着正确的方向轻推。
// 编辑:
因此,如果所有 238 个网格都被渲染,看起来 vkDeviceWaitIdle 需要大约 32 毫秒来执行。(如果没有渲染,则小于 1 毫秒)。大部分停滞都源于那里,但我仍然不知道该怎么办。