【问题标题】:How to compress textures for use in SceneKit如何压缩纹理以在 SceneKit 中使用
【发布时间】:2017-01-09 06:44:15
【问题描述】:

我尝试了 Xcode 中的 texturetool 来压缩一堆 .png 纹理以用于 SceneKit 场景。根据Apple docs尝试了几个选项。

  texturetool -e PVRTC --channel-weighting-linear --bits-per-pixel-4 -o ImageL4.pvrtc Image.png

生成的图像是原始 png 大小的 3 到 4 倍。我预计它会明显更小。这些是方形纹理,2 的幂等。最终使其更小并进行有损优化传递。

纹理压缩的正确方法是什么(适用于 iOS10)?

更新了压缩测试结果。有了这张图片,它大约是。 2 倍大小。毫不奇怪,结果与 textureTool 相同。 PVRTexTool(来自 Imagination Technologies)提供了多种格式可供选择。

【问题讨论】:

  • 就我个人而言,我建议使用 photoshop 及其相当不错的 .png 压缩,适用于大多数几何和矢量类的东西。 .jpg 用于具有视觉复杂性的图像/图片。然后寻找方法来简化解压并在应用程序中使用,以最大程度地造福最终用户。我认为 PVRTC 有点像白日梦。

标签: textures scenekit


【解决方案1】:

在纹理压缩方面考虑“正确”的方式主要有三种(我想不到)。

  1. 纹理占用的存储空间,以及您在追求更小的纹理文件大小时愿意接受的细节损失方面的妥协。这可能包括实际物理上缩小纹理,然后再扩展它,但通常与不同的有损格式作斗争,考虑到...

  2. 压缩对加载时间的影响程度,因为您的包中的所有压缩图像都必须解压缩以供 GPU/CPU 和您的应用程序使用,以将图像作为纹理等呈现在屏幕上。一些图像格式和压缩类型比其他格式需要更长的时间来解压缩。有些快如闪电,但更大。

  3. 最后一个问题是您将在 GPU 内存中使用的纹理格式。这通常是一些细节,但在某些硬件上还有更多选项。是每种颜色 2、4、5、8 位吗? alpha 有多少位?等等。

并非所有视频加速器和系统都支持多种格式的纹理,但 Apple 可以,正如您可能已经发现的那样。每一个都是大小与细节权衡的混合体。更少的颜色位 = 更少的渐变定义等。Apple 的硬件在解压缩某些格式方面也非常出色,而在其他方面则很糟糕。而且你的封装的最终尺寸显然是不同设备类型的不同关注点。

在需要使用一些存储管理之前,您在 Apple TV 上的大小限制为 200MB。

100 MB 的应用程序对单元数据等的限制。

【讨论】:

  • 我期望 pvrtc 压缩后文件大小更小是错的吗? Apple 文档和其他文章都暗示文件大小更小。我是否在使用 texturetool 时遗漏了什么?在纹理上使用像 ImageOptim 这样的有损压缩工具会带来其他问题 - 在某些情况下(但不是全部),在 SceneKit 编辑器中,场景仅以一种颜色呈现,红色。
  • PVRTC 将为您提供比非压缩位图更小的文件大小,无论是 .png、TIFF 还是任何其他非压缩格式。鲜为人知的是,大多数 .png 导出器(Photoshop 等)实际上(默认情况下)使用无损压缩。因此,从 Photoshop 导出的简单图形/矢量样式图像将远小于其像素位和字节的总和,并且它们的颜色将处于未压缩状态。 PVRTC 是一种非常温和、非常简单的压缩格式,专为在 PowerVR GPU 上进行非常快速的解压缩而设计。由此得名。这不是很好的压缩。
  • 而 .jpg,当明智地使用并与复杂的图像(想想照片)一起使用时,将比压缩的 .png 或 PVRTC 希望达到的压缩效果更有效。 .jpg 压缩的成本是解压缩到 GPU 所需的位精确数据并在屏幕上呈现比解压缩 PVRTC 文件需要更长的时间。 PVRTC 文件可以如此快速地解压缩,以至于您可以以该格式存储视频的全尺寸帧,并以足够快的速度将它们解压缩以将它们显示为视频。即使在 PC 上,.jpg 解压也无法达到这种解压速度。
  • 鉴于 .png 压缩与简单图形元素的质量和有效性,以及 .jpg 对复杂图像的压缩比,除了需要快速解压缩的图像之外,很难证明使用 PVRTC 是合理的。这可能是您的加载屏幕。对于其他所有内容,您可能会找到方法让玩家的期望延迟足够长的时间,以便对 .jpg 和 .png 资源进行足够的解压以开始进行。
  • @sambro 我希望这会有所帮助。 PVRTC 是快速、低能量的减压,压缩比不好。 .jpg 是高能解压缩,具有非常好的压缩率,但有一些质量损失。 .PNG 压缩在中间的某个地方,但在非常复杂的图像中会遇到大小问题,因为它尽量不降低图像的质量,而 .jpg 压缩会严重破坏一些质量并丢失细节以获得更小的文件大小。跨度>
【解决方案2】:

这与您的问题略有关联,但讨论了纹理压缩,包括 PVRTC here

TLDNR:PNG 和 JPEG 可能适合纹理数据的存储/传输,但它们必须在 GPU 访问它们之前在内存中完全解压缩)

但是,如果您确实拥有可以很好地使用 PNG 压缩的纹理,则很有可能通过对数据进行一点重新排序,压缩后的 PVRTC /ETC/S3TC 图像也可能受益于无损压缩(例如 zlib 等),这可能会解决您的存储问题。

【讨论】:

  • 欣赏解释和链接。用一些测试数据更新了问题。
  • 重新更新:通过“文件大小没有差异......质量非常好”,我假设您指的是 PVRTexTool + PVRTC。该设置仅更改压缩工具在搜索压缩表示时投入的努力(即 CPU 周期),即尝试减少视觉差异。压缩数据将始终为 4bpp 或 2bpp。如果我有时间,我可能会尝试创建一个 2k*2k 图像(我假设它是 RGBA?),它会产生 ~1MB PNG,看看我是否可以将 gzip/zlib 应用到它。(我确实有一个团队成员在做这件事,但他在完成并被搁置之前离开了)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-21
  • 2018-12-21
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多