好的,所以我正在尝试权衡使用各种不同纹理压缩技术的利弊。我 99.999% 的时间都在使用 DirectX 为 Windows 机器编写 2D 精灵游戏。
到目前为止,我已经研究了带有 alpha 修剪的纹理打包(SpriteSheets),这似乎是获得更多性能的好方法。现在我开始研究它们存储的纹理格式;目前所有内容都存储为 *.PNG。
我听说 *.DDS 文件很好,特别是与 DXT5(/3/1,具体取决于任务)压缩一起使用时,因为纹理在 VRAM 中保持压缩状态?人们还说,由于它们已经是 DirectDraw Surface,因此加载速度也快得多。
所以我创建了一个应用程序来测试这一点;我调用该行 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,但没有任何效果。
EDIT:我忘了提及这些文件(*.png 和 *.dds)都是相同的图像,只是以不同的格式保存。 (相同的大小、alpha 量,一切!)
EDIT 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 Viewer 中看起来很好。然而,当加载时,所有透明度都会变成纯黑色。色键问题?
EDIT 3:忽略最后一点,我太白痴了,在我的“快速示例”匆忙中,我忘记了在 D3DXSprite->Begin() 上启用 Alpha 混合。哎哟!