我遇到了CPU使用率问题。当我启动我的应用程序时,它的动画以良好的速度启动,所有突然的动画速度降低,然后应用程序崩溃。但是当我用Activity Monitor(仪器)检查应用程序时,我的应用程序使用的CPU接近80%-90%。我无法降低CPU使用率。
CODE:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint location;
UITouch *touch = [[event allTouches] anyObject];
location = [touch locationInView:self.view];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint location;
UITouch *touch = [[event allTouches] anyObject];
location = [touch locationInView:self.view];
touchMovedX = location.x;
touchMovedY = location.y;
[self merge];
}
// -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
//{
// [self merge];
// }
-(void)merge
{
CGSize size = CGSizeMake(320, 480);
UIGraphicsBeginImageContext(size);
CGPoint point1 = CGPointMake(0,0);
CGPoint point2 = CGPointMake(touchMovedX,touchMovedY);
UIImage *imageOne = [UIImage imageNamed:@"iphone.png"];
[imageOne drawAtPoint:point1];
UIImage *imageTwo = [UIImage imageNamed:@"Cloud.png"];
[imageTwo drawAtPoint:point2];
imageB.image=imageTwo;
UIImage *imageC = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
imageview = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,480)];
imageview.image=imageC;
[self.view addSubview:imageview];
}
-(IBAction)save:(id)sender {
UIImage* imageToSave = imageview.image;
UIImageWriteToSavedPhotosAlbum(imageToSave, nil, nil, nil);
[imageToSave release];
}
任何帮助都会很明显。
由于
答案 0 :(得分:2)
请勿在{{1}}代码中致电touchesMoved
。 iOS调用touchesBegan
以响应移动的触摸
与touchesMoved
同样 - 当用户从屏幕上移开手指时会调用此
此外 - 您的合并代码正在为您的视图添加越来越多的子视图 - 在每次合并调用结束时,您都会调用touchesEnded
,这将增加处理所有子视图时的CPU使用率。每当你移动手指移动时,这将添加一个新的子视图,永远不会删除它们。
答案 1 :(得分:1)
-(void)viewDidAppear:(BOOL)animated{
UIPanGestureRecognizer *pgr1 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(image1Moved:)];
[iv1 addGestureRecognizer:pgr1];
}
-(void)image1Moved:(UIPanGestureRecognizer *)pgr{
NSLog(@"Came here");
[iv1 setCenter:[pgr locationInView:self.view]];
}
做一些像上面这样的事情。你可以在哪里移动imageview。
此外,使用另一个按钮调用合并,您可以随意移动图像,但是当需要合并时,单击一个按钮。这样,您只需调用一次Merge,它就不会对CPU造成任何负担。
看起来你是初学者,我强烈建议你按照一些教程学习更多关于
的内容答案 2 :(得分:0)
不是touchesMoved或touchesBegan导致CPU使用率。这肯定是[自我合并]。我假设你在[自我合并]中正在做一些CPU密集型工作,并且这样做了很多次。
您必须在另一个线程上执行任何CPU密集型作业,以使应用程序具有响应能力。此外,如果你在每一个动作都做的事情,那么它可能会变得太慢。
请在合并方法中发布您正在执行的操作的代码。
你可以做三件事
改进合并方法以提高效率。
使用Grand Central发送
了解dispatch_async(dispatch_get_global_queue,^ {});这将在Grand Central Dispatch部分下。
然后如果您不希望同样多次调用相同的方法,或者在调用之前没有必要进行每次移动
[NSObject cancelPreviousPerformRequestsWithTarget:<#(id)#>选择:其中#(SEL)#>对象:其中#(ID)#>
取消方法将取消先前的调用并再次调用该方法。
但同样,这一切都取决于你想要做什么。