我正在使用 Direct3D 制作 2D 游戏,并用于D3DXCreateTextureFromFileInMemoryEx
加载我的游戏图像。我的游戏中有 221KB 大小的图像。但是当我使用D3DXCreateTextureFromFileInMemoryEx
将图像加载到内存时。它们在内存中使用了数十次。
那么,我怎样才能减少使用的内存呢?
默认情况下,D3DX 纹理加载功能非常灵活,将通过执行各种格式转换、压缩/解压缩、缩放、mip-map 生成和其他任务来帮助您将任意源图像转换为可用纹理。
如果您想阻止任何这种转换(这在 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_DEFAULT_NONPOW2
对于Width
andHeight
参数和参数(意思D3DX_DEFAULT
是 MipLevels
从文件中获取尺寸并且不要将大小四舍五入到 2 的幂)*。D3DFMT_FROM_FILE
对于Format
参数(意味着使用文件中的确切纹理格式)。D3DX_FILTER_NONE
对于Filter
andMipFilter
参数(意味着不执行任何缩放或过滤)。如果您将源资源预处理为您希望在运行时使用的确切格式,将它们保存为 DDS 文件并设置上面的所有标志以告诉 D3DX 不要执行任何转换,那么您应该会发现您的纹理加载速度更快并且没有过多的内存使用。
*这要求您的目标硬件支持非 2 纹理的幂,或者您只使用 2 纹理的幂。过去 5 年的几乎所有硬件都支持非 2 纹理的幂,所以这应该是相当安全的。