2014-01-21 39 views
0

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

问题1

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

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

问题2

在资源,如非压缩图像的情况下(例如TGA,不是PNG)当我们读取整个文件(图像文件前),我们无法获得adventage的CreateFileMapping(),MapViewOfFile(),所以我认为压缩资源更好,你怎么看?

问题3

你怎么看待包装的时候压缩的资源数据是什么?

回答

2

游戏资源不仅可以缩小尺寸,还可以通过将许多小文件合并为一个来减少搜索次数,这比磁盘上的大小要重要得多。传统硬盘上的一次不必要的查找花费与读取千兆字节数据相同的时间。即使您的“压缩”只包含连接小文件,您已经获得了性能。
作为一个小小的好处,资源包装在一个档案中会让他们不敢从计算机高端的人身上遮住他们,阻止他们修改游戏资产(尽管承认这不是一个很大的障碍!)。

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:对于任何非平凡的游戏,包装资源绝对可取。