Vulkan命令缓冲区按需更新实践遇阻,求有效实现方案
Vulkan命令缓冲区按需复用的实现问题
多数基于Vulkan的渲染器通过VkQueueSubmit()提交命令时,会每帧重建命令缓冲区(cmdbuf)以简化动态场景的处理逻辑。但我正在尝试构建一套仅按需更新/失效、其余情况复用命令缓冲区的渲染器——这类设计在3D编辑器场景中非常实用:场景里大量内容长期保持不变,而ImGui这类即时模式GUI则需要每帧更新对应的命令缓冲区。
我已搭建基础的按需构建命令、复用不变缓冲区的机制,但初始版本仅支持「完全复用所有命令」或「完全重建所有命令」两种模式,虽预留了场景局部更新的框架,但还需补充功能才能让局部更新生效。
已尝试的两种隔离GUI通道的方案
- 方案一:将原有的「单个主命令缓冲区包含所有子通道」结构,改为GUI子通道使用二级命令缓冲区、其余内容使用主命令缓冲区。但受VUID-vkCmdExecuteCommands-contents-06018约束,在没有
VK_EXT_nested_command_buffer扩展的情况下,同一RenderPass内无法混合使用主命令缓冲区和二级命令缓冲区构建的子通道,此方案无法生效。 - 方案二:将GUI子通道放在独立RenderPass的二级命令缓冲区中,主命令缓冲区记录帧的整体结构并复用。但运行时触发了VUID-vkQueueSubmit-pCommandBuffers-00070验证错误,发现二级命令缓冲区修改后,主命令缓冲区必须重建,达不到复用主缓冲区的目的。
尚未尝试的方案
将所有子通道都记录到二级命令缓冲区,每帧仅重建主命令缓冲区,只更新GUI对应的二级命令缓冲区。
我认为Vulkan规范在命令缓冲区复用的细节说明上不够清晰,希望有成功实现类似需求的开发者分享可行的实现方案。
内容的提问来源于stack exchange,提问作者Dess
相关产品推荐
相关产品推荐

