【问题标题】:Memory usage of UIImageView vs CCSpriteUIImageView 与 CCSprite 的内存使用情况
【发布时间】:2012-01-13 10:31:40
【问题描述】:

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

在 iOS 开发中,有没有办法让显示的图像只占用与磁盘上文件大小一样多的内存,而不是更多 - UIImageView 在 UIKit 中是如何工作的?

【问题讨论】:

  • 我经常想到自己的好问题。
  • 精湛的问题需要知道 CCSprite 与 UIImageView 的区别

标签: uikit uiimageview cocos2d-iphone


【解决方案1】:

没有也没有。

值得重复:磁盘上图像文件的大小无法与内存中图像的大小作为texture进行比较。

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

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

至于压缩,iOS 设备上唯一支持的格式是PVRTC2 and PVRTC4(2 和 4 代表 2-Bit 和 4-Bit,但这与实际的颜色位深度无法比较)。使用这种格式的纹理占用的内存非常少,渲染速度非常快,但您会损失图像质量和色彩活力,在许多情况下,这太过分了。

剩下的就是未压缩的格式,它们可以是 8 位、16 位或 32 位纹理。 8 位纹理仅用于遮罩、着色和其他技术用途,它们本质上是灰度图像。

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

开发人员通常会努力使用 16 位纹理,因为这样可以将内存使用量减半并略微提升性能。除非图像使用渐变,否则丢失的额外颜色会变得明显。对于大型图像或快速移动的图像,PVR 图像可以提高渲染性能和内存使用率,但仅应在与未压缩纹理的差异几乎不明显的情况下使用。

最后,UIImageView 没有针对渲染速度进行优化,至少一点都没有。如果你打算基于 UIImageView 制作游戏,你也可以在自己的脚上开枪——那样你实际上会为自己省去一些痛苦。 :)

【讨论】:

  • 感谢您澄清这一点以及有关 UIImageView 的额外 cmets - 您预计我接下来的一些问题。在加入 Cocos2D 之前,我一直主要为 Web 浏览器编程,我认为我的困惑源于从未考虑那里的内存,只考虑图像重量。如果您不介意,最后一个问题...如果我在屏幕上显示了一个纹理的十个实例,并且用于一个纹理的内存是 m,那么使用的总内存是 10m、m 还是介于两者之间?
  • 如果纹理是从同一张图片加载的,Cocos2D 将缓存该纹理,因此如果您有 1 个或 100 个使用相同纹理的精灵,则在内存方面没有区别。当然,减去每个精灵的开销,每个精灵低于 500 字节。
  • 这让我很开心。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多