5

对于 iPhone 游戏开发,出于性能考虑,我从 PNG 格式切换到 PVRTC 格式。但是 PVRTC 压缩创建的文件比 PNG 文件大得多。所以 140 KB (1024x1024) 的 PNG 在 PVRTC 格式中膨胀到 512 KB 或更多。我在某处读到 50 KB 的 PNG 文件被压缩到大约10KB,就我而言,它是相反的..

发生这种情况的任何原因以及我如何避免这种情况..如果 PVRTC 压缩盲目地进行 4bpp 转换 (1024x1024x0.5) 而与 PNG 中的透明度无关,那么我们在这里实现的压缩是什么..

我的游戏中有 100 张这些 1024x1024 的图像,因为有很多角色每个都在做一些复杂的动画。所以在每张图像 512KB 的速度下,我的应用程序将获得超过 50MB ..这对我的客户来说是不可接受的..( PNG,我本可以让我的应用程序达到 10MB)..

4

4 回答 4

17

通常,未压缩的图像数据是 24bpp (RGB) 或 32bpp (RGBA) 扁平率。PVRTC 是 4bpp(或 2bpp)扁平率,因此与此相比压缩了 6 或 8(12 或 16)倍。

图形硬件原生使用纹理的一个要求是纹理的格式必须是硬件可以随机访问的。PVRTC 是这种格式,PNG 不是,这就是为什么 PNG 可以实现更大的压缩比。PVRTC 是一种运行时、部署格式;PNG是一种存储格式。

PVRTC 压缩一次在 4x4 像素块上以固定比特率执行,因此很容易计算在内存中的何处检索获取特定纹素值所需的数据,并且只需要一次访问内存。图形核心中有专用电路,它将解码这个 4x4 块并将纹素值提供给您的着色器/纹理组合器等。

PNG 压缩不适用于固定比特率,并且从其中检索特定值更复杂;需要从多个位置访问内存以检索单个颜色值,并且每次发生纹理读取时都需要更多的内存和处理。所以它不适合用作原生纹理格式,这就是为什么你的纹理必须在图形硬件使用它们之前解压缩。与不需要解压缩即可使用的 PVRTC 相比,这增加了带宽使用。

因此对于离线存储(磁盘上应用程序的大小),PNG 比 PVRTC 小,而 PVRTC 比完全未压缩的要小。对于运行时内存占用和性能,PVRTC 比 PNG 更小更快,因为它必须解压缩,因此与未压缩的纹理一样大和慢。您可能会在初始化磁盘访问时使用 PNG 获得一些优势,但是您会浪费时间进行解压缩。

如果您想减少 PVRTC 的存储空间,您可以尝试对纹理文件进行 zip 样式压缩,并在从磁盘加载时展开这些文件。

于 2009-11-23T13:09:11.077 回答
2

PVRTC(PowerVR Texture Compression)是一种纹理压缩格式。在使用 PowerVR 的设备上,例如大多数高端手机,包括 iPhone 和其他基于 ARM 的小工具,如 iPod,绘图速度非常快,因为绘图是硬件加速的。它还使用更少的内存,因为图像以压缩形式表示并在每次绘制时解码,而 PNG 在绘制之前需要解压缩。

PNG是无损压缩。

PVRTC 是有损压缩,意味着它近似于图像。它具有完全不同的设计标准。

PVRTC 将“压缩”(通过近似)任何类型的艺术作品,为每个纹素提供固定的位数,包括照片图像。

PNG 不近似图像,因此如果图像包含很少的冗余,它几乎不会压缩。另一方面,统一的图像(例如插图)使用 PNG 压缩效果最好。

它的苹果和橘子。

于 2009-11-06T09:56:34.657 回答
0

将多个帧平铺到单个图像上,并对纹理的子矩形进行 blit。这将大大减少您的内存消耗。

如果您的图像是 64x64,那么您可以将其中的 256 张以 16x16 的排列放置在 1024x1024 纹理上。

稍加努力,图像不需要全部相同大小,只要您跟踪每个图像所在纹理中矩形的代码即可。

这就是 iPhone 游戏开发者的做法。

于 2009-11-09T06:53:29.227 回答
0

我同意威尔。这个问题没有意义。我把这个问题读了 3 遍,但我仍然不知道 Sankar 想知道什么。这只是抱怨,毫无疑问。

我唯一可以建议的是,如果您介意使用 PVRTC,请不要使用它。它提供了性能提升并节省了 VRAM,但在这种情况下它对您没有帮助。因为你想要的只是减少游戏量,而不是考虑性能和质量之间的权衡。

于 2010-02-04T22:27:40.213 回答