- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这似乎是一个简单的 Vulkan API 问题,但在 Internet 上搜索后我真的找不到答案。
我注意到有一个 Vulkan 函数:
void vkCmdUpdateBuffer(
VkCommandBuffer commandBuffer,
VkBuffer dstBuffer,
VkDeviceSize dstOffset,
VkDeviceSize dataSize,
const void* pData);
vkCmd
以其名义,但文件说
vkCmdUpdateBuffer is only allowed outside of a render pass. This command is treated as “transfer” operation, for the purposes of synchronization barriers.
memcpy()
将数据从主机复制到设备。
vkCmdUpdateBuffer()
的单个 Vulkan 示例/教程(我已经搜索了所有这些)而不是通过
memcpy()
手动处理数据.我理解错了吗?
最佳答案
全部 vkCmd*
函数将命令生成到命令缓冲区中。这个也不异常(exception)。这是一个传输命令,与大多数传输命令一样,您无法在渲染过程中执行它们。但是有很多命令缓冲区生成命令在渲染 channel 中不起作用。
通常 Vulkan 内存传输操作只发生在设备内存之间。主机将某些内容放入设备内存的典型机制是写入映射指针。但根据定义,这要求目标内存是可映射的。所以如果你想写一些东西到不可映射内存,你必须把它复制到可映射内存,然后通过vkCmdCopy*
在可映射内存到不可映射内存之间做一个传输操作。职能。
如果您同时进行大量传输,那也没关系。您可以将一堆东西复制到映射内存中,然后提交一个包含所有复制操作的批处理,以将数据复制到适当的位置。
但有时,您只是更新一小块设备内存。如果它不可映射,那么仅仅为了将几千字节的数据传送到 GPU 就需要做很多工作。在这种情况下,vkCmdUpdateBuffer
可能是更好的选择,因为它可以“直接”从 CPU 内存复制到任何设备内存。
我说“直接”是因为这显然不是它在做什么。它真的在做你会做的同样的事情,除了它是在命令缓冲区中做的。您可以将 CPU 数据复制到 GPU 可映射内存中,然后创建一个命令,从该可映射内存复制到不可映射内存中。vkCmdUpdateBuffer
做完全相同的事情。它将数据从您提供的指针/大小复制到可映射内存(由命令缓冲区本身提供。这就是为什么它的上限为 64KB)。这个复制会立即发生,就像你做 memcpy
一样。 ,所以当这个函数返回时,你可以用你给它的指针做任何你想做的事情。然后它在命令缓冲区中创建一个命令,该命令从命令缓冲区中的可映射内存复制到目标内存位置。
The documentation for this function明确警告将其用于较大的传输。也就是说,它告诉你不要那样做。这是用于不可映射内存的快速、小型、一次性更新。而已。
这就是教程不讨论它的一个原因:这是一个非常特殊的函数,许多新手用户会尝试使用它,因为它比显式代码更容易。但在大多数情况下,他们不应该使用它。
关于vulkan - 一个很少提及的 Vulkan 函数 "vkCmdUpdateBuffer()",它是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54673223/
这似乎是一个简单的 Vulkan API 问题,但在 Internet 上搜索后我真的找不到答案。 我注意到有一个 Vulkan 函数: void vkCmdUpdateBuffer( VkC
我是一名优秀的程序员,十分优秀!