我正在开发一个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]]];
}
以这种方式加载图像是否有效?将图像首先加载到数组或类似的东西会更好吗?
我希望一次加载所有加载时间,而不是在旋转时加载。
答案 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的动画。
每次从一个交换到另一个时,完全按照我上面的说法完成,然后就完成了。
(对于记录,请记住在初始化时首先加载一个,以便上面的代码片段在第一次使用它时正常工作,你知道。如果可能的话,当你使用时释放最后一个完成。)干杯。