降低应用程序的CPU使用率

时间:2012-12-07 10:16:06

标签: iphone instruments

我遇到了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];

}

任何帮助都会很明显。

由于

3 个答案:

答案 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造成任何负担。

看起来你是初学者,我强烈建议你按照一些教程学习更多关于

的内容
  1. 实例变量
  2. 属性
  3. 手势识别器等

答案 2 :(得分:0)

不是touchesMoved或touchesBegan导致CPU使用率。这肯定是[自我合并]。我假设你在[自我合并]中正在做一些CPU密集型工作,并且这样做了很多次。

您必须在另一个线程上执行任何CPU密集型作业,以使应用程序具有响应能力。此外,如果你在每一个动作都做的事情,那么它可能会变得太慢。

请在合并方法中发布您正在执行的操作的代码。

你可以做三件事

  1. 改进合并方法以提高效率。

  2. 使用Grand Central发送

  3. 了解dispatch_async(dispatch_get_global_queue,^ {});这将在Grand Central Dispatch部分下。

    1. 另一种方法是[self performSelector:@(merge)afterDelay:0.5s]; 此方法将每0.5秒调用一次合并。
    2. 然后如果您不希望同样多次调用相同的方法,或者在调用之前没有必要进行每次移动

      [NSObject cancelPreviousPerformRequestsWithTarget:<#(id)#>选择:其中#(SEL)#>对象:其中#(ID)#>

      取消方法将取消先前的调用并再次调用该方法。

      但同样,这一切都取决于你想要做什么。