我阅读了很多关于Vulkan内存管理的文章,并且他们都建议使用临时缓冲区来传输到GPU。 但是我们已经可以创建设备本地和主机可见的内存,主机连贯。它可以从GPU读取,也可以从CPU写入。
这是我认为合理的 - 创建一个绑定到内存的大缓冲区,该内存是设备本地,主机可见和连贯。现在对于所有动态缓冲区,我们只是继续使用此缓冲区中的内存并将缓冲区绑定在该偏移量处。
但是在大多数示例中,它们创建了一个主机可见缓冲区和一个可见的gpu,并使用copyBuffer操作进行传输。与仅使用cpu和gpu都可访问的缓冲区相比,这有什么好处?我只谈论缓冲,而不是纹理。
答案 0 :(得分:4)
创建一个绑定到内存的大缓冲区,该内存是设备本地,主机可见且连贯。
并非所有设备都有这样的内存堆。因此,如果您想要便于携带,则需要考虑到这一点。
如果您想要/必须放入缓冲区的内存不是主机可见的,那么除了使用临时缓冲区之外别无选择。
答案 1 :(得分:4)
正如棘轮怪说的那样,设备不需要具有设备本地和主机可见的内存类型。即使大多数人这样做,但规模可能有限。也许在过去的几年里情况已经发生了变化,但过去的PCI-E和BIOS限制意味着256 MB或者512 MB就是你能得到的。最后,CPU写入PCI-E的带宽将低于CPU自身的内存。因此,即使使用临时缓冲区使用两倍的总带宽,如果可以在传输队列上异步完成,也可以最大限度地缩短CPU和图形管道在传输上花费的时间。因此,使用登台缓冲区是否会取决于特定的CPU和GPU组合,以及您的应用程序正在做什么。
然而,在移动设备或集成GPU这样的SOC上,使用临时缓冲区很少会成为胜利者。移动GPU不应具有有限的设备本地+主机可见堆大小。看看vulkan.gpuinfo.org上的几个Windows集成GPU,看起来现代的英特尔集成GPU也没有这样的限制,但AMD集成的GPU仍然可以(我只看了几个随机样本,YMMV)。 p>
这一切都很难给出明确的“永远做X”的建议。就个人而言,我通常会这样做: