对于iPhone游戏开发,我为了性能而从PNG格式切换到PVRTC格式。但是PVRTC压缩正在创建比PNG文件大得多的文件。因此,一个140 KB(1024x1024)的PNG在PVRTC格式中膨胀到512 KB或更多。我在某处读到一个50KB的PNG文件被压缩到大约10KB,在我的情况下,反过来..
为什么它会以这种方式发生以及我如何避免这种情况的任何原因..如果PVRTC压缩盲目地进行4bpp转换(1024x1024x0.5)而不考虑PNG中的透明度,那么我们在这里实现的压缩是什么.. < / p>
我的游戏中有100个这样的1024x1024图像,因为有很多角色各自做一些复杂的动画..所以在这个512KB的图像速率下,我的应用程序将超过50MB ..这对我的客户来说是不可接受的。 (使用PNG,我可以将我的应用程序设置为10MB)..
答案 0 :(得分:17)
通常,未压缩的图像数据是24bpp(RGB)或32bpp(RGBA)flatrate。 PVRTC为4bpp(或2bpp)平坦,因此与此相比压缩为6或8(12或16)倍。
图形硬件本身使用纹理的要求是纹理的格式必须是硬件随机可访问的。 PVRTC就是这种格式,PNG不是,这就是为什么PNG可以实现更高的压缩比。 PVRTC是一种运行时部署格式; PNG是一种存储格式。
PVRTC压缩一次在4x4像素块上以平坦比特率执行,因此很容易计算内存中的位置,以检索从中获取特定纹素值所需的数据,并且只有一个访问权限需要内存。图形核心中有专用电路,可以对这个4x4块进行解码,并为着色器/纹理合成器等提供纹素值。
PNG压缩不能以平坦的比特率工作,从而检索特定值会更复杂;需要从多个位置访问存储器以便检索单个颜色值,并且每次纹理读取发生时都需要更多的存储器和处理。所以它不适合用作原生纹理格式,这就是为什么你的纹理必须在图形硬件使用它们之前解压缩的原因。与PVRTC相比,这增加了带宽使用,PVRTC不需要解压缩即可使用。
因此,对于离线存储(磁盘上应用程序的大小),PNG小于PVRTC,小于完全未压缩的PVRTC。对于运行时内存占用和性能,PVRTC比PNG更小更快,因为它必须解压缩,与未压缩纹理一样大且慢。在初始化磁盘访问时,您可能会获得PNG的一些优势,但随后您将失去解压缩的时间。
如果您想减少PVRTC的存储空间,可以尝试对纹理文件进行压缩式压缩,并在从磁盘加载时展开它们。
答案 1 :(得分:2)
PVRTC(PowerVR纹理压缩)是一种纹理压缩格式。在使用PowerVR的设备上,例如大多数高端手机,包括iPhone和其他基于ARM的小工具,如iPod,它绘制起来非常快,因为它是硬件加速的。它也使用更少的内存,因为图像以压缩形式表示并解码每个绘图,而PNG需要在绘制之前解压缩。
PNG是无损压缩。
PVRTC是有损压缩,意味着它接近图像。它有完全不同的设计标准。
PVRTC将“压缩”(通过近似)任何类型的艺术作品,每个纹素包含固定位,包括照片图像。
PNG不会近似图像,因此如果图像包含很少的冗余,则根本不会压缩。另一方面,均匀图像,例如插图将使用PNG进行最佳压缩。
它的苹果和橘子。
答案 2 :(得分:0)
将多个框架平铺在单个图像上并对纹理的子矩形进行blit。这将显着减少您的内存消耗。
如果您的图像是64x64,那么您可以将其中的256个放置在1024x1024纹理上,采用16x16排列。
只需稍加努力,图像就不需要具有相同的大小,只要您在每个图像所在的纹理中跟踪矩形代码即可。
iPhone游戏开发者就是这样做的。
答案 3 :(得分:0)
我同意威尔。这个问题没有意义。我读过这个问题3次,但我仍然不知道Sankar想知道什么。这只是一个抱怨,毫无疑问。
我唯一可以建议的是,如果你想使用它,请不要使用PVRTC。它提供了性能提升并节省了VRAM,但在这种情况下它无济于事。因为你想要的只是减少游戏量,而不是考虑性能和质量之间的权衡。