Directx 如何减少D3DXCreateTextureFromFileInMemoryEx的内存使用?

Directx 如何减少D3DXCreateTextureFromFileInMemoryEx的内存使用?,directx,direct3d,Directx,Direct3d,我正在用Direct3D制作一个2D游戏,并使用D3DXCreateTextureFromFileInMemoryEx加载我的游戏图像。我的游戏中有221KB大小的图像。但是,当我使用D3DXCreateTextureFromFileInMemoryEx将图像加载到内存时,它们在内存中的使用次数越来越多 那么,如何减少使用内存呢?默认情况下,D3DX纹理加载功能非常方便,可以尝试执行各种格式转换、压缩/解压缩、缩放、mip贴图生成和其他任务,帮助您将任意源图像转换为可用纹理 如果要防止任何转换(

我正在用Direct3D制作一个2D游戏,并使用
D3DXCreateTextureFromFileInMemoryEx
加载我的游戏图像。我的游戏中有221KB大小的图像。但是,当我使用D3DXCreateTextureFromFileInMemoryEx将图像加载到内存时,它们在内存中的使用次数越来越多


那么,如何减少使用内存呢?

默认情况下,D3DX纹理加载功能非常方便,可以尝试执行各种格式转换、压缩/解压缩、缩放、mip贴图生成和其他任务,帮助您将任意源图像转换为可用纹理

如果要防止任何转换(CPU成本和内存使用都可能非常昂贵),则需要确保源纹理的格式与您想要的格式完全相同,然后将标志传递给D3DX,告知其不要执行任何转换或缩放

通常,唯一支持D3D使用的所有纹理格式的文件格式是D3D格式DDS,因此您需要将所有源资源保存为DDS文件。如果用于制作纹理的软件不直接支持保存DDS文件,则可以使用DirectX SDK附带的工具为您执行转换,编写自己的工具或使用其他第三方转换工具

如果已安装完整的DirectX SDK(2010年6月的SDK,最后一个独立版本),则可以使用随附的DirectX纹理工具。不过,Windows 8 SDK没有附带此功能(DirectX SDK现在是Windows SDK的一部分,并且不是作为独立SDK提供的)

一旦您将源资源转换为DDS文件,格式与您希望在运行时使用的格式完全相同(可能是DXT压缩,预生成完整的mipmap链),您就需要将正确的标志传递给D3DX纹理加载函数,以避免任何转换。这意味着您应该通过:

  • D3DX\u DEFAULT\u NONPOW2
    用于
    Width
    Height
    参数,
    D3DX\u DEFAULT
    用于
    MipLevels
    参数(意思是从文件中获取尺寸,不要将尺寸四舍五入到2的幂)*
  • D3DFMT_FROM_FILE
    用于
    格式
    参数(意味着使用文件中的精确纹理格式)
  • D3DX\u FILTER\u NONE
    用于
    FILTER
    MipFilter
    参数(表示不执行任何缩放或过滤)
如果您将源资源预处理为运行时希望使用的精确格式,将其另存为DDS文件,并设置上面的所有标志以告知D3DX不要执行任何转换,那么您应该会发现纹理加载速度更快,并且不会过度占用内存

*这要求您的目标硬件支持非增强2纹理,或者您仅使用增强2纹理。过去5年中几乎所有的硬件都支持非2级纹理,所以这应该是非常安全的