DirectX11 中的纹理流,不可变与动态

Texture streaming in DirectX11, Immutable vs Dynamic

我们经常遇到需要将纹理流式传输到显卡的情况(在游戏中:地形,在我的例子中来自不同输入源的图像,例如 cameras/capture cards/videos)

当然在相机的情况下,我在一个单独的线程中接收我的数据,但仍然需要将该数据上传到 GPU 进行显示。

我知道 2 个型号。

那么我是否遗漏了这些技术,或者是否有更好的方法来处理这个问题?

这是更新纹理D3D11的两种主要方法。

但是,第一种方法不会导致与第二种情况相同的内存使用模式的假设取决于驱动程序,并且可能不正确。如果要覆盖整个图像(这听起来像您正在做的),您将使用 D3D11_MAP_WRITE_DISCARD,这意味着缓冲区的当前内容变得不确定。然而,这仅从 CPU 的观点来看是正确的。如果它们可能用于挂起的绘制操作,它们将保留给 GPU。在这种情况下,大多数(也许是全部?)驱动程序实际上会为映射纹理的写入位置分配新的存储空间,否则命令缓冲区处理将需要停止。如果您不使用丢弃标志,则同样如此。相反,当在命令缓冲区中处理 map 命令时,资源的缓冲区将更新为从 D3D11_MAPPED_SUBRESOURCE.

中的 Map 返回的值。

此外,您必须在即时上下文中更新动态纹理是不正确的。只有当您在延迟上下文中更新它们时,您才必须使用 D3D11_MAP_DISCARD 标志。这意味着如果要覆盖整个纹理,您可以在工作线程上更新纹理。

最重要的是,由于 PC 上的 CPU/GPU 系统不是统一的内存系统,因此在更新来自 CPU 的 GPU 资源时会出现同步问题。