在iPad上优化加载许多图像

时间:2010-10-28 08:18:31

标签: xcode image ipad memory-management ios

我正在开发一个iPad项目,我试图通过切换预渲染图像来模拟3D体的旋转。

在内存管理方面,我不是最敏锐的人,所以我想知道是否有人有关于如何优化这一点的任何提示。

我的解决方案现在看起来像这样:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *myTouch = [[event allTouches] anyObject];
CGPoint location = [myTouch locationInView:self.view];
int pictureIndex;
//Rough mapping of image to point on screen
if (location.x <= 384 ) {
    pictureIndex = (384 - location.x)/(768/rotatingPictures)+1;
}
else {
    pictureIndex = rotatingPictures - (location.x-384)/(768/rotatingPictures)+1;
}
[theImageView setImage:[UIImage imageNamed:[NSString stringWithFormat:@"image_%d.png", pictureIndex]]];

}

以这种方式加载图像是否有效?将图像首先加载到数组或类似的东西会更好吗?

我希望一次加载所有加载时间,而不是在旋转时加载。

1 个答案:

答案 0 :(得分:8)

第一个关键信息是 imageNamed无望 !众所周知,它是一只狗。这既不是一件事,也不是另一件事;它不能很好地缓存,并且往往会占用太多的内存。 (Google上有100篇文章。) 所以,那就是

您必须准确地告诉我们您有多少张图片,以及每幅图片的确切大小(KB或MB)。

只有这样才能决定一个成功的策略。

要“正确”地从一个大图像切换到另一个大图像,如果你反复交换大图像,如果你不得不担心内存,你可以这样做..

[hugeImage.image release];
hugeImage.image = [[UIImage alloc] initWithContentsOfFile:
           [[NSBundle mainBundle]
           pathForResource:@"bodyPart"
           ofType:@"png"]];

将正确摆脱上一张图片并引入下一张图片。永远,永远使用imageNamed - 它专门设计用于小型(即图标大小)界面使用(即按钮,图标等)图像。

然而,在我们知道图像的精确数量和精确尺寸之前,没有人可以帮助您,实际上每秒或每分钟您想要交换图像的频率。希望它有所帮助!

-----你继续说...

“89 .png图片大小从大约70 K到100 K”

好消息,你将 没有任何问题 。你可以轻松加载它们,甚至可以实时快速地制作20到30 fps的动画。

每次从一个交换到另一个时,完全按照我上面的说法完成,然后就完成了。

(对于记录,请记住在初始化时首先加载一个,以便上面的代码片段在第一次使用它时正常工作,你知道。如果可能的话,当你使用时释放最后一个完成。)干杯。