好的,所以我正在尝试权衡使用各种不同纹理压缩技术的专业人士和使用者。我花了99.999%的时间使用DirectX为Windows机器编写2D精灵游戏。
到目前为止,我已经研究了带有alpha修剪的纹理打包(SpriteSheets),这似乎是一种获得更高性能的好方法。现在我开始看看它们存储的纹理格式;目前所有内容都存储为* .PNGs。
我听说* .DDS文件很好,尤其是当与DXT5(/ 3/1取决于任务)压缩一起使用时,因为纹理在VRAM中保持压缩状态?还有人说,因为它们已经是DirectDraw Surfaces,所以它们的加载速度也快得多。
所以我创建了一个应用程序来测试它;我将该行调用了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)都是相同的图片,只是以不同的格式保存。 (相同大小,阿尔法数量,一切!)
编辑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中看起来很好。但是当装入所有透明度时变成纯黑色。 ColorKey问题?
编辑3:忽略最后一点,我是愚蠢的,在我的“快速示例”中,我忘了在D3DXSprite-&gt; Begin()上启用Alpha-Blending。卫生署!
答案 0 :(得分:14)
您需要区分文件存储在磁盘上的格式和纹理最终在视频内存中使用的格式。 DXT压缩纹理在内存使用和视频内存质量之间提供了良好的平衡,但其他压缩技术(如PNG或Jpeg压缩)通常会导致较小的文件和/或更高质量的磁盘。
DDS文件的优势在于它们直接支持DXT格式,并且以与DirectX期望数据在内存中布局相同的方式布局在磁盘上,因此在加载它们以将它们转换为数据后,所需的CPU时间最短硬件可以使用的格式。它们还支持预生成的mipmap链,其格式类似于PNG不支持。将图像压缩为DXT格式是一个相当耗时的过程,因此您通常希望尽可能避免在加载时执行此操作。
具有预生成的mipmap的DDS文件与您计划从中创建的视频内存纹理的大小相同并使用相同的格式,将使用任何标准格式的最短CPU时间。您需要确保告诉D3DX不要执行任何缩放,过滤,格式转换或mipmap生成以保证这一点。 D3DXCreateTextureFromFileEx
允许您指定阻止任何内部转换的标记(如果您的硬件支持两种纹理的非幂,D3DX_DEFAULT_NONPOW2
以防止mipmap生成或格式转换,则D3DFMT_FROM_FILE
用于图像宽度和高度D3DX_FILTER_NONE
以防止任何过滤或缩放)。
CPU时间只是故事的一半。这些天CPU速度非常快,硬盘驱动器速度相对较慢,因此如果加载较小的压缩文件格式(如PNG或JPG),然后执行大量CPU工作来转换它,有时您的总加载时间会比加载更大的文件时更短就像一个DDS,只是做一个记忆到视频内存。提供良好结果的常用方法是压缩DDS文件并对其进行解压缩,以便从磁盘快速加载,并将格式转换的CPU成本降至最低。
像PNG和JPG这样的压缩格式会比其他格式更有效地压缩某些图像。 DDS是固定的压缩比 - 给定的图像分辨率和格式将始终压缩到相同的大小(这就是为什么它更适合硬件中的解压缩)。如果您使用简单的非代表性图像进行测试(例如统一颜色或简单图案),那么您的PNG文件可能非常小,因此将比典型的游戏图像更快地从磁盘加载。
答案 1 :(得分:1)
比较加载标准PNG,然后将其压缩到加载DDS文件所需的时间。
我仍然无法理解为什么PNG的加载速度比压缩的DXT5相同。对于其中一个它会相当小,所以它应该更快地加载形式磁盘!这个DXt5纹理是否与PNG纹理相同?即他们是相同的大小?
您是否尝试过使用D3DXCreateTextureFromFileEx?您可以更好地控制正在发生的事情。它可能会帮助你。