打包和压缩资源数据

时间:2014-01-21 15:17:11

标签: c++ game-engine zlib

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

问题1

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

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

问题2

对于资源,例如未压缩的图像(例如tga,而不是png),当我们必须读取整个文件(例如图像文件)时,我们无法获得CreateFileMapping(),MapViewOfFile()的冒险,所以我认为压缩资源更好,你怎么看?

问题3

您对打包时压缩资源数据有何看法?

1 个答案:

答案 0 :(得分:2)

游戏资源不仅可以缩小尺寸,还可以通过将许多小文件合并为一个来减少搜索次数,这比磁盘上的大小要重要得多。传统硬盘上的单个不必要的搜索花费的时间与读取数GB的数据相同。即使您的“压缩”仅包含将小文件连接在一起,您也已经获得了性能 作为一个小小的奖励,拥有存档的资源有点模糊了他们与计算机不卫生的人,阻止他们修改游戏资产(虽然不可否认,这不是一个很大的障碍!)。

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

Q2:游戏中通常不会出现未压缩的图像。大多数情况下,您需要使用DXT压缩,而不是减少磁盘I / O,而是减少内存和PCIe带宽要求以及GPU内存消耗。 DXT是一种非常差的压缩,但它在硬件中工作,并具有完全可预测的压缩比。您可以使用传统的通用压缩器再次压缩DXT压缩纹理(具有不同的速率,具体取决于您使用的压缩器,有一些特别针对该目的进行了优化)。

Q3:对于任何非平凡的游戏,明确建议包装资源。