我认为 *.DDS 文件应该能够快速加载?

2024-05-06

好的,所以我正在尝试权衡使用各种不同纹理压缩技术的利弊。我 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 混合。哎哟!


您需要区分文件在磁盘上存储的格式和纹理最终在视频内存中使用的格式。 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 一样,只需对视频内存执行 memcpy 即可。提供良好结果的常见方法是压缩 DDS 文件并解压缩它们,以便快速从磁盘加载,并最大限度地降低格式转换的 CPU 成本。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我认为 *.DDS 文件应该能够快速加载? 的相关文章

  • 由于图像,应用程序尺寸较大。如何压缩 .PNG 图像?

    我正在开发一个应用程序 它有很多图像需要处理 因此我的应用程序的大小变得非常大 我想压缩或类似的东西来减小应用程序的大小 任何想法 png 放置在res drawable are 自动优化 http developer android co
  • 将 3D 模型转换为 SceneJS JSON,包括纹理

    Motive我正在尝试使用 WebGL 创建一个小型演示应用程序 我选择使用 SceneJS 因为它看起来是一个简单的框架 并且足以满足此目的 我已经下载了几个 blend 模型 等 并使用 Blender 将它们导出为 Collada d
  • Python中最佳比率的压缩?

    Python 中哪种压缩方法的压缩率最好 常用的是zlib compress 最好的还是有更好的选择 我需要获得尽可能最佳的压缩比 我正在压缩字符串并通过 UDP 发送它们 我压缩的典型字符串大约有 1 700 000 字节 我确信可能有一
  • DirectSound 是 Windows 上最好的音频抽象层吗?

    DirectSound 是 Windows 上最好的音频抽象层吗 将我的应用程序从针对特定芯片组构建的非常糟糕的声音实现切换到抽象层 应用程序是原生Winform net 3 5 DirectX DirectSound 是可能的选择 但有点
  • PHP gzuncompress 出现文件读写错误

    我有一个函数可以跟踪脚本中发生的事件 为了有效地利用我的资源 我决定压缩它生成的数据 但是 我不断收到此错误 Unknown error type 2 gzuncompress function gzuncompress data erro
  • 上传前压缩相机图像

    我正在使用这段代码 来自www internetria com http www internetria com blog 2013 04 12 android enviar imagenes por webservice 拍照并上传到服务
  • 纯文本压缩算法的现状如何?

    为了纪念哈特奖 http prize hutter1 net 文本压缩的顶级算法 以及每种算法的快速描述 是什么 注意 这个问题的目的是获得压缩算法的描述 而不是压缩程序的描述 突破边界的压缩器结合了疯狂结果的算法 常见的算法包括 The
  • 动画 GIF 作为 THREE.js 中的纹理

    我正在寻找一种在 THREE js 中使用 GIF 动画作为纹理的方法 我目前可以加载纹理 甚至是 GIF 格式 但它无法播放动画 有什么办法可以做到吗 我发现了一些像这样的链接 https github com JordiRos GLGi
  • QNetworkManager 默认情况下是否接受压缩回复?

    我在用Q网络管理器 https doc qt io qt qnetworkaccessmanager html从服务器获取文件 但是我不知道文件在传输过程中是否使用标准 gzip 压缩进行压缩 如果不是 如何让它们下载压缩文件 我该如何去检
  • 使用 YUIcompressor 压缩多个 JavaScript 文件?

    我正在尝试使用 YUI 压缩机压缩多个 JS 文件 我认为我的语法错误 我想压缩目录中以以下内容开头的所有文件at 然而 当 YUI 压缩机运行时 我发现 YUI 压缩机在输出中只放置了一个文件的压缩版本 具体来说 假设我有三个文件 at
  • 尽管缓冲区分配给 compressBound 结果(文件太大?),zlib compress() 返回 Z_BUF_ERROR

    使用 zlib 时 我调用compress 给出一个Z BUF ERROR当我尝试压缩一个 13G 的文件时 尽管我认为缓冲区分配是正确的 此代码适用于较小的文件 struct stat infile stat FILE fp NULL i
  • 如何使用 Python GZip 模块压缩文件夹?

    我正在创建压缩文件 文件夹的 Python 软件 我将如何创建一段代码 要求用户输入文件夹位置 然后对其进行压缩 我目前拥有单个文件的代码 但没有包含完整文件的文件夹 请详细解释如何执行此操作 将文件夹压缩为 tar 文件的代码是 impo
  • DirectX 世界视图矩阵乘法 - GPU 或 CPU 的地方

    我是 directx 的新手 但令我惊讶的是 我看到的大多数示例中 世界矩阵和视图矩阵都是作为顶点着色器的一部分相乘 而不是与 CPU 相乘并将结果传递给着色器 对于刚性对象 这意味着您为对象的每个顶点将相同的两个矩阵相乘一次 我知道 GP
  • 在 JavaScript 中压缩 Blob

    我需要使用 ajax 向服务器发送一个 blob 但它最终可能会变得有点大 我想减少上传时间 我已经尝试过 jszip 但这只是在 zip 中给了我一个空文件 我也尝试过 btoa 但事实证明编码值最终只是 object Blob 而不是实
  • 从选定位置导入 Python 模块

    假设我有三个脚本 Main py 包含所有导入 1 py 随机脚本 2 py 随机脚本 pyinstaller F onedir Main py 80mb pyinstaller F onedir 1 py 80mb pyinstaller
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex
  • 如何在java中压缩/解压tar.gz文件

    谁能告诉我在java中压缩和解压缩tar gzip文件的正确方法我一直在搜索 但我能找到的最多的是zip或gzip 单独 我写了一个包装器公共压缩 http commons apache org compress called jarchi
  • 快速搜索压缩文本文件

    我需要能够在大量压缩文件 txt 中搜索文本 压缩可能会改变为其他东西 甚至成为专有的 我想避免解压所有文件并压缩 编码 搜索字符串并在压缩文件中搜索 这应该可以通过对所有文件使用相同的码本使用霍夫曼压缩来实现 我不想重新发明轮子 所以 任
  • 无需构建树即可预测霍夫曼压缩比

    我有一个二进制文件 我知道其中每个符号出现的次数 如果我要使用霍夫曼算法压缩它 我需要预测压缩文件的长度 我只对假设的输出长度感兴趣 而不对单个符号的代码感兴趣 因此构建霍夫曼树似乎是多余的 作为一个例子 我需要得到类似的东西 包含 4 个
  • 尝试渲染 SDL_Texture 时 C++ SDL2 错误:无效纹理

    我正在尝试制作一个简单的游戏 当我尝试渲染我的SDL Texture 我收到一个莫名其妙的错误 我已经将一切设置正确 我能够成功地清除屏幕SDL RenderClear 并且我的纹理不为空 因此它应该已正确创建 但是当我尝试打电话给rend

随机推荐