【问题标题】:Packing and compressing resource data打包和压缩资源数据
【发布时间】:2014-01-22 00:47:15
【问题描述】:

我尝试使用 zlib 打包和压缩游戏客户端资源数据。如果我压缩数据,它会减少磁盘 I/O,因为文件大小会减小,但解压缩时会增加 CPU 使用率。

问题1

如果用于渲染的资源被压缩,处理(渲染和解压缩)使用CPU,所以我认为它似乎相当慢,是吗?

如果不进行压缩,则磁盘 I/O 没有更改,并且不会出现额外的 CPU 使用情况。如果只读取文件的一部分,可以使用 CreateFileMapping()、MapViewOfFile() 函数来减少 DISK I/O。

问题2

在资源的情况下,例如未压缩的图片(例如tga,不是png),当我们必须读取整个文件(例如图像文件)时,我们无法获得CreateFileMapping(),MapViewOfFile()的出现,所以我认为压缩资源更好,你怎么看?

问题3

你对打包时压缩资源数据有什么看法?

【问题讨论】:

    标签: c++ game-engine zlib


    【解决方案1】:

    打包游戏资源不仅是为了减小大小,而且还通过将许多小文件合并为一个来减少查找次数,这比磁盘上的大小更重要。在传统硬盘上进行一次不必要的查找所花费的时间与读取 1 GB 数据的时间一样多。即使您的“压缩”仅包括将小文件连接在一起,您也已经获得了性能。
    作为一个小小的好处,将资源打包在档案中会在一定程度上使不熟悉计算机的人无法看到它们,从而阻止他们修改游戏资产(尽管不可否认,这不是一个很大的障碍!)。

    Q1:根据您使用的压缩算法,您可以轻松获得超过 1 GB/s 的解压缩速度(在快速 CPU 下接近 2 GB/s)。即使在固态(通常更少)下,顺序磁盘 I/O 仍然最大约为 300-400 MB/s。随机访问磁盘 I/O 速度会慢 5-20 倍,具体取决于磁盘和访问模式。
    另一方面,如果你选择慢速算法,你可以获得低至每秒几十 KB 的解压缩速度,这比从磁盘加载更多数据要糟糕得多。秘诀是选择一种压缩得相当好(不完美,只是合理)并以良好的解压缩速度运行的算法。压缩速度通常无关紧要,因为这是离线完成一次。候选算法例如是 LZF、Snappy 或 LZ4。
    不管内容是否被压缩,一般都可以使用文件映射。此外,相反,文件映射不仅仅是对于非常小的部分的优势。您的读取量越大,它的优势就越大(非常小的视图实际上使用传统读取可能会更快)。

    Q2:未压缩的图像通常不会出现在游戏中。大多数时候,您会希望使用 DXT 压缩,与其说是减少磁盘 I/O,不如说是减少内存和 PCIe 带宽要求以及 GPU 内存消耗。 DXT 是一种非常糟糕的压缩方式,但它可以在硬件中运行,并且具有完全可预测的压缩率。您可以使用传统的通用压缩器再次压缩 DXT 压缩的纹理(使用不同的压缩率,具体取决于您使用的压缩器,有一些专门针对该目的进行了优化)。

    Q3:打包资源对于任何不平凡的游戏都是绝对可取的。

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 2013-10-26
      • 2010-11-16
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多