Jon*_*tan 1 xcode memory-management image ipad 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]]];
Run Code Online (Sandbox Code Playgroud)
}
以这种方式加载图像是否有效?将图像首先加载到数组或类似的东西会更好吗?
我希望一次加载所有加载时间而不是旋转时加载.
第一个关键信息是imageNamed无望!众所周知,它是一只狗.这既不是一件事,也不是另一件事; 它不能很好地缓存,并且往往会占用太多的内存.(Google上有100篇文章.)所以,那就是了.
您必须准确地告诉我们您拥有的图像数量,以及每个图像的确切大小(KB或MB).
只有这样才能决定成功的策略.
要从一个大图像交换到另一个"正确",如果你一遍又一遍地交换巨大的图像,如果你不得不担心内存,你就这样做了.
[hugeImage.image release];
hugeImage.image = [[UIImage alloc] initWithContentsOfFile:
[[NSBundle mainBundle]
pathForResource:@"bodyPart"
ofType:@"png"]];
Run Code Online (Sandbox Code Playgroud)
这将正确摆脱以前的图像,并引入下一个图像.永远,永远使用imageNamed - 它专门设计用于小型(即图标大小)界面使用(即按钮,图标等)图像.
然而,在我们知道图像的精确数量和精确尺寸之前,没有人可以帮助您,实际上每秒或每分钟您想要交换图像的频率.希望能帮助到你!
-----你继续说...
"89.png图片大小从大约70 K到100 K"
好消息,你不会有任何问题.您可以轻松加载这些,甚至可以实时快速地制作20 - 30 fps的动画.
简单地完成我每次从一个交换到另一个之后我说的话,你就完成了.
(对于记录,请记住在初始化时首先加载一个,以便上面的代码片段在使用它的"第一次"时正常工作,如果可能的话,在完成后释放最后一个.)干杯.