DirectX纹理是否共享/减少(32位)应用程序的地址空间?

DirectX纹理是否共享/减少(32位)应用程序的地址空间?,directx,32-bit,Directx,32 Bit,想象一下: 一个32位的应用程序,它有2 GB的地址空间,因此最多可以分配2 GB的内存(让碎片放在旁边) 具有1 GB图形内存的图形卡 当应用程序使用例如1.5 GB的内存时,是否可以再分配1 GB的纹理?它总共将使用2.5 GB的内存,这对于32位应用程序本身是不可能的 只有当应用程序“锁定”纹理以获取指向内存的指针时,AFAIK纹理才会映射到应用程序的地址空间。所以我的假设是地址空间只在锁期间需要。因为只有一些纹理被锁定,所以不应该占用整个地址空间 当应用程序使用例如1.5 GB时 内

想象一下:

  • 一个32位的应用程序,它有2 GB的地址空间,因此最多可以分配2 GB的内存(让碎片放在旁边)
  • 具有1 GB图形内存的图形卡
当应用程序使用例如1.5 GB的内存时,是否可以再分配1 GB的纹理?它总共将使用2.5 GB的内存,这对于32位应用程序本身是不可能的

只有当应用程序“锁定”纹理以获取指向内存的指针时,AFAIK纹理才会映射到应用程序的地址空间。所以我的假设是地址空间只在锁期间需要。因为只有一些纹理被锁定,所以不应该占用整个地址空间

当应用程序使用例如1.5 GB时 内存不足,能否再分配1个 GB的纹理

这个问题没有简单的答案,因为纹理可以在视频内存中分配,但也可以在系统内存中分配

所以这取决于用法

使用此构造函数并注意池参数:

public Texture(
    Device device,
    int width,
    int height,
    int numLevels,
    Usage usage,
    Format format,
    Pool pool
)
如果选择Pool.VideoMemory,则数据将被放入视频内存中,系统内存中只存储使用几个字节的几个成员。如果选择Pool.SystemMemory,那么当然要使用内存分配空间

获取视频内存纹理的曲面指针并使用锁定位时:

surface->LockRect(&bits,0,0)
实际上,您正在本地内存中分配一个名为bits的新变量。因此,这种类型的纹理的答案仍然是否定的。另一个变量使用内存分配空间,这就是您将位返回到的变量

在VideoMemory池上分配的DX纹理仅使用几个字节的系统内存进行分配

希望有帮助,
火星。

我的问题确实涉及到视频内存中的纹理。我这样理解你的答案:只要我不一次锁定所有纹理,我确实可以分配比我的32位地址空间提供的内存更多的内存。确切地说:因此,你可以使用视频内存中的纹理存储更多内存,但当你需要在本地(在CPU上,而不是使用像素着色器)操作纹理时,你不能一次访问所有纹理您需要为本地需要的每个纹理使用本地内存。一旦完成,您需要释放内存,首先通过将位复制回视频内存中的曲面,将纹理存储回视频内存