【问题标题】:PVRTC compression increasing the file sizes of PNGPVRTC 压缩增加 PNG 的文件大小
【发布时间】:2010-12-13 18:41:25
【问题描述】:

对于 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)..

【问题讨论】:

  • 您的意思是您将动画序列保存为 1024x1024 PNG?
  • 是的..它们中的大多数是 1024x1024 大小的 PNG..尽管这主要与要求图像为正方形的 PVRTC 有关..否则它们可以是更小尺寸的 PNG..跨度>
  • PVRTC 在 GPU 上应该很小,而不是在你的硬盘上。我永远不会使用 PVRTC 来存储/分发纹理。此外,如果您不需要同时访问数百个 1024x1024 纹理,只需坚持使用 PNG,无需在 GPU 上进行压缩。

标签: image-processing compression png pvrtc


【解决方案1】:

一般来说,未压缩的图像数据是 24bpp (RGB) 或 32bpp (RGBA) flatrate。 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 样式压缩,并在从磁盘加载时展开这些文件。

【讨论】:

  • 实际上 PNG 是内部压缩的。所以压缩你的 PVRTCs 你应该得到更小的文件。但是,正如答案所指出的那样,PVRTC 是关于减少 VRAM 中的内存大小,而不是关于磁盘空间。 PNG 正好相反,磁盘空间小,但在 VRAM 中扩展时为 MB。
  • @deft_code 这是错误的。 PNG 不会压缩它的数据,它只是在可以节省空间的情况下使用选择性的托盘和增量过滤器。
  • @RichardJ.RossIII,RGB 图像的 PNG 规范只使用了一个 delta 过滤器(一个糟糕的过滤器)。过滤后的数据然后被 DEFLATE'd aka zip。
【解决方案2】:

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

PNG 是无损压缩。

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

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

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

它的苹果和橘子。

【讨论】:

  • 我知道 PNG 和 PVRTC 压缩是什么。我在问为什么 PVRTC 压缩会创建一个更大的文件,尽管做了近似值和 4bpp 的事情。
  • so 4bpp 意味着获取原始图像,并且对于每个像素,以 4 位存储。所以让我们算一下:1024x1024x0.5 = 524288 = 512KB。你期待什么?
  • 膨胀?解码后的 PNG 将采用 1024x1024 x3 或 x4,具体取决于其 RGB 还是 RGBA。那是... 3 或 4MB 的 RAM。 PVRTC 中的同一图像始终占用 512KB (0.5MB) 的 RAM。
  • 感谢您提供的信息。但是,我的大部分 PNG 都是透明的。所以它的大小很小。只有 140 KB。这意味着 PVRTC 不会以不同的方式处理透明度,而是在所有像素??我不明白他们为什么将其称为压缩技术。它显然很愚蠢..除了它具有硬件加速..那么我将如何使用 PVRTC 减小我最终的 iPhone 应用程序的大小?因为我将拥有接近 100 张这种大小的图像。使用 PNG,应用程序将在 10MB 左右。但 PVRTC 可能会使我的应用程序大小达到 50MB 左右。
  • @Sankar 更新你的问题以更具体地询问这个问题,也许给一些赞成票,我会考虑一个新的答案,因为这个问题似乎是一个移动的目标
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 感谢您将问题阅读了 3 遍,并发现问题没有意义,但最终仍然以一般的方式回答......无论如何......我得到了答案......那里没有什么叫做 PVRTC“压缩”,因为它不“压缩”,它只是一种格式。我的困惑是由于在 PVRTC 方面“压缩”这个词的通用用法。
    • “压缩”一词是指通过特殊编码使数据量变小。不适用于特定算法。有时它表示“编码”动作本身。 (本例为解码解压)
    • 在 PVRTC 的情况下,术语“压缩”仅适用于内存卷。 PNG 占用的体积较小,但它只是磁盘内情况的唯一情况。 PNG 必须在内存中解压缩为 GPU 使用的纯位图。因为 GPU 无法理解和处理 PNG。因此它在内存中占用的空间比 PVRTC 大。内存和磁盘是不同的空间。每种格式在每个空格中都有自己的值。如果您认为“压缩”只能在磁盘中进行,那么 PVRTC 对您来说是一个新概念。这是一种内存压缩。这是可能的,因为 GPU 直接支持它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2010-12-02
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多