我正在使用Direct3D制作2D游戏,并使用D3DXCreateTextureFromFileInMemoryEx
加载我的游戏图像。我的游戏中有221KB大小的图像。但是,当我使用D3DXCreateTextureFromFileInMemoryEx
将图像加载到内存时。它们在使用的记忆中变成了数十次。
那么,我怎样才能减少使用记忆?
答案 0 :(得分:0)
默认情况下,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
和Height
参数,D3DX_DEFAULT
代表MipLevels
参数(意思是从文件中获取尺寸而不是围绕大小为2)*。 D3DFMT_FROM_FILE
代表Format
参数(意味着使用文件中的确切纹理格式)。D3DX_FILTER_NONE
代表Filter
和MipFilter
参数(表示不执行任何缩放或过滤)。如果您预先处理源资产的格式是您想要在运行时使用的格式,请将它们保存为DDS文件并设置上面的所有标志以告诉D3DX不要执行任何转换然后您应该找到纹理加载更快,没有过多的内存使用。
*这需要您的目标硬件支持2个纹理的非功率,或者您只使用2个纹理的功率。几乎所有过去5年的硬件都支持2种纹理的非功能,但这应该是非常安全的。