我有一个同步host_write -> device_read
统一缓冲区的屏障。此屏障位于预先录制的命令缓冲区中,因此基本上每帧执行一次。但是,如果我的统一缓冲区经常不更新(比如投影矩阵)怎么办?是否仍然可以对没有改变的静态数据执行障碍?这有多贵?
答案 0 :(得分:3)
规范有一个特殊段落,用于将数据直接写入内存(通过映射内存),刷新然后提交命令缓冲区的情况:
vkQueueSubmit命令自动保证主机写入 如果是,则刷新到VK_ACCESS_HOST_WRITE_BIT 在执行命令之前刷新,因此在大多数情况下是显式的 这种情况不需要记忆障碍。在少数情况下 主机写入和设备之间不发生提交的位置 读访问,可以使用显式内存使写入可用 屏障。
这意味着在您的情况下,可能不需要显式内存屏障。但是在您只将数据写入内存一次,但多次重复使用该内存的情况下,您可以记录带有内存屏障的命令缓冲区并仅提交一次。然后您可以多次提交其他命令缓冲区,预先记录或不预先记录,并且它们不需要这样的障碍。
一般而言 - 障碍可能会引入等待,因此可能会对性能产生影响。所以这意味着,如果你不需要障碍,你应该避免它。
答案 1 :(得分:2)
它有多贵?
据我所知,规范给出了 no 保障屏障省略。所以一般来说,它可能没有任何成本,或者它可能花费正常价格(取决于司机)。