【问题标题】:Do DirectX Textures share/reduce Address Space of the (32 Bit) Application?DirectX 纹理是否共享/减少(32 位)应用程序的地址空间?
【发布时间】:2011-03-08 15:15:55
【问题描述】:

想象一下:

  • 具有 2 GB 地址空间的 32 位应用程序,因此最多可以分配 2 GB 内存(除了碎片)
  • 具有 1 GB 显存的显卡

当应用程序使用例如1.5 GB 内存,能否再分配 1 GB 纹理?它将总共使用 2.5 GB 的内存,这对于 32 位应用程序本身来说是不可能的。

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

【问题讨论】:

    标签: directx 32-bit


    【解决方案1】:

    当应用程序使用例如1.5 GB 内存,能不能再分配 1 GB 纹理?

    对此没有简单的答案,因为纹理可以在视频内存中分配,但它们也可以在系统内存中。

    所以这取决于使用情况。

    取这个构造函数,注意 Pool 参数:

    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)
    

    您实际上是在本地内存中分配一个名为位的新变量。所以这种纹理的答案仍然是否定的。另一个变量使用内存分配空间,这就是你得到位的变量。

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

    希望对您有所帮助, 火星。

    【讨论】:

    • 我的问题确实提到了视频内存中的纹理。我这样理解你的回答:只要我不一次锁定所有纹理,我确实可以分配比我的 32 位地址空间提供的更多的内存。
    • 完全正确:因此您可以使用视频内存中的纹理存储更多内存,但是当您需要在本地(在 CPU 上,而不是使用像素着色器)操作它们时,您不能一次全部访问它们需要为本地需要的每个纹理使用本地内存。完成后,您需要释放该内存,首先通过将位复制回显存中的表面将纹理存储回显存
    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 2012-01-22
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多