好的,所以我正在尝试权衡使用各种不同纹理压缩技术的利弊。我花费了 99.999% 的时间为使用 DirectX 的 Windows 机器编写 2D sprite 游戏。
到目前为止,我已经研究了带有 alpha-trimming 的纹理打包(SpriteSheets),这似乎是一种获得更多性能的好方法。现在我开始研究它们存储的纹理格式;目前所有内容都存储为 *.PNG。
我听说 *.DDS 文件很好,尤其是与 DXT5(/3/1,取决于任务)压缩一起使用时,因为纹理在 VRAM 中保持压缩?人们还说,由于它们已经是 DirectDraw 表面,因此它们的加载速度也快得多。
所以我创建了一个应用程序来测试它;我调用了 20 次以下的行,在每次调用之间释放纹理。
for (int i = 0; i < 20; i++)
{
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"Test.dds", &g_pTexture ) ) )
{
return E_FAIL;
}
g_pTexture->Release();
g_pTexture = NULL;
}
现在,如果我使用 DXT5 纹理尝试此操作,完成时间比加载简单 *.PNG 的时间长 5 倍。我听说如果你不生成 Mipmap,它会变慢,所以我仔细检查了一遍。然后我更改了用于生成 *.DDS 文件的程序,切换到 NVIDIA 自己的 nvcompress.exe,但没有任何效果。
编辑:我忘了提到文件(*.png 和 *.dds)都是相同的图像,只是以不同的格式保存。(相同的大小,alpha 的数量,一切!)
编辑 2:当使用以下参数时,它的加载速度几乎快了 2.5 倍,并且消耗的 VRAM 更少!
D3DXCreateTextureFromFileEx( g_pd3dDevice, L"Test.dds", D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_FROM_FILE, 0, D3DFMT_FROM_FILE, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTexture )
但是,我现在失去了纹理中的所有透明度,我查看了 DXT5 纹理,它在 Paint.NET 和 DirectX DDS 查看器中看起来很好。但是,当加载所有透明度时,会变成纯黑色。颜色键问题?
编辑 3:忽略最后一点,我很愚蠢,在我的“快速示例”中,我忘记在 D3DXSprite->Begin() 上启用 Alpha-Blending。嗬!