UIImageView与CCSprite的内存使用情况

时间:2011-12-05 17:40:20

标签: uikit uiimageview cocos2d-iphone

我对Cocos2D有比UIKit更多的经验。 Cocos2D的挑战之一是CCSprite可以使用的内存量。此数量不受磁盘上图像文件大小的影响 - 而是基于图像的尺寸和使用的像素格式。因此,它不受对图像文件进行的优化的影响,尽管这些可能允许使用更便宜的像素格式。

在iOS开发中,有没有办法让显示的图像只占用磁盘上文件大小的内存,而不是更多 - 这就是UIImageView在UIKit中的工作方式吗?

1 个答案:

答案 0 :(得分:3)

不,不。

需要重复的是:磁盘上的图像文件大小无法与内存中的图像大小texture进行比较。

例如,PNG文件使用无压缩压缩,而与JPG文件相同的图像使用有损压缩,因此可以显着缩小。但是一旦作为纹理加载,两个纹理将使用相同数量的内存,因为GPU不知道PNG或JPG是什么,它只能使用GPU支持的各种纹理格式,并且这些格式不会碰巧是任何常见的图像文件格式,因为它们的用途非常不同。

应该在屏幕上显示的每个图像都需要加载到纹理中。纹理尺寸由几个属性定义:尺寸,颜色和尺寸。 alpha bith深度,以及支持的地方:压缩。

至于压缩,iOS设备上唯一支持的格式为PVRTC2 and PVRTC4(2位和4位代表2位和4位但不能与实际颜色位深度相比)。使用这种格式的纹理使用非常少的内存并且渲染速度非常快,但是你会失去图像质量和色彩活力,在许多情况下只是太多而无法接受。

这将为您提供未压缩格式,即8位,16位或32位纹理。 8位纹理仅用于遮罩,着色和其他技术用途,它们本质上是灰度图像。

游戏和应用程序中使用的纹理要点是16位或32位。意味着纹理中的每个像素需要2个字节或4个字节的内存。无论图像文件大小如何,具有32位颜色深度的1024x1024纹理使用1024x1024x4 = 4,194,304字节或4兆字节的内存。

通常开发人员都会努力使用16位纹理,因为这样可以减少内存使用量并提高性能。除非图像使用渐变,否则缺少的额外颜色会变得明显。对于大图像或快速移动的图像,PVR图像可以提高渲染性能和内存使用率,但只应在未压缩纹理的差异难以察觉的情况下使用。

最后,UIImageView并未针对渲染速度进行优化,而不是最低限度。如果你打算制作一款基于UIImageView的游戏,你也可以用脚射击自己 - 你实际上可以节省一些痛苦。 :)