我认为*.DDS文件意味着可以快速加载?

Siy*_*ion 4 compression directx textures directdraw dds-format

好吧,所以我试图权衡使用各种不同纹理压缩技术的专业人士和骗子.我花了99.999%的时间使用DirectX为Windows机器编写2D精灵游戏.

到目前为止,我已经看了纹理打包(SpriteSheets)与alpha修剪,这似乎是获得更多性能的好方法.现在我开始看看它们存储的纹理格式; 目前所有内容都存储为*.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;
 }
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用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 )
Run Code Online (Sandbox Code Playgroud)

但是,我现在正在失去纹理的所有透明度,我看了DXT5纹理,它在Paint.NET和DirectX DDS Viewer中看起来很好.但是当装入所有透明度时变成纯黑色.ColorKey问题?

编辑3:忽略最后一点,我是愚蠢的,在我的"快速示例"中,我忘了在D3DXSprite-> Begin()上启用Alpha-Blending.卫生署!

mat*_*ort 14

您需要区分文件存储在磁盘上的格式和纹理最终在视频内存中使用的格式.DXT压缩纹理在内存使用和视频内存质量之间提供了良好的平衡,但其他压缩技术(如PNG或Jpeg压缩)通常会导致较小的文件和/或更高质量的磁盘.

DDS文件的优势在于它们直接支持DXT格式,并且以与DirectX期望数据在内存中布局相同的方式布局在磁盘上,因此在加载它们以将它们转换为格式后,所需的CPU时间最短硬件可以使用.它们还支持预生成的mipmap链,其格式类似于PNG不支持.将图像压缩为DXT格式是一个相当耗时的过程,因此您通常希望尽可能避免在加载时执行此操作.

具有预生成的mipmap的DDS文件与您计划从中创建的视频内存纹理的大小相同并使用相同的格式,将使用任何标准格式的最少CPU时间.您需要确保告诉D3DX不要执行任何缩放,过滤,格式转换或mipmap生成以保证这一点.D3DXCreateTextureFromFileEx允许您指定阻止任何内部转换发生的标志(D3DX_DEFAULT_NONPOW2对于图像宽度和高度,如果您的硬件支持两个纹理的非幂,D3DFMT_FROM_FILE以防止mipmap生成或格式转换,D3DX_FILTER_NONE以防止任何过滤或缩放).

CPU时间只是故事的一半.这些天CPU速度非常快,硬盘驱动器速度相对较慢,因此如果加载较小的压缩文件格式(如PNG或JPG),然后执行大量CPU工作来转换它,有时您的总加载时间会比加载更大的文件时更短就像一个DDS,只是做一个记忆到视频内存.提供良好结果的常用方法是压缩DDS文件并将其解压缩,以便从磁盘快速加载,并最大限度地降低CPU格式转换成本.

像PNG和JPG这样的压缩格式会比其他格式更有效地压缩某些图像.DDS是固定的压缩比 - 给定的图像分辨率和格式将始终压缩到相同的大小(这就是为什么它更适合硬件中的解压缩).如果您使用简单的非代表性图像进行测试(例如,统一颜色或简单图案),那么您的PNG文件可能非常小,因此将比典型的游戏图像更快地从磁盘加载.