在Vulkan中将StructuredBuffer指定为只读的实现方案
跨API适配StructuredBuffer的性能问题排查与结论
问题背景
在HLSL中使用StructuredBuffer实现跨D3D12和Vulkan(通过SPIR-V编译)的只读GPU缓冲区时,出现如下现象:
- D3D12端运行符合预期,性能正常
- Vulkan端只能将该缓冲区绑定为RenderDoc标记为读写的storage buffer,初期测试性能比D3D12低约10%(其他场景两者性能一致)
- 尝试将描述符绑定为uniform buffer类型时,Vulkan验证层报错;虽可改用uniform texel buffer,但希望保留
StructuredBuffer的着色器使用模式
排查结果与优化方案
性能差异的核心原因
性能差距并非由storage buffer的读写属性导致,而是测试场景的绘制顺序在两个API中存在差异:DX12的绘制顺序触发了更多早期Z剔除操作,减少了无效片元的渲染开销,因此表现更优。统一绘制顺序后,两者性能基本持平。Vulkan端的额外优化点
Vulkan支持直接使用host-visible内存,通过调用vkFlushMappedMemoryRanges完成内存同步,无需像D3D12那样执行显式的缓冲区复制和内存屏障操作,实际内存操作效率反而高于D3D12。
内容的提问来源于stack exchange,提问作者Varrak
相关产品推荐
相关产品推荐

