0

我遇到了 CPU 使用率问题。当我启动我的应用程序时,它的动画以良好的速度开始,突然动画速度降低,然后应用程序崩溃。但是当我使用 Activity Monitor(Instrument) 检查应用程序时,我的应用程序使用的 CPU 接近 80%-90%。我无法减少 CPU 使用率。

代码:

-(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];

}

任何帮助都是不言而喻的。

谢谢

4

3 回答 3

2

不要调用touchesMoved你的touchesBegan代码。touchesMoved由 iOS 调用以响应被移动的触摸

同样touchesEnded- 当用户从屏幕上移开手指时调用它

此外 - 您的合并代码正在向您的视图添加越来越多的子视图 - 在每次调用合并时,您正在调用[self.view addSubview:imageview]这将增加您在处理所有子视图时的 CPU 使用率。每次您在触摸中移动手指时,这将添加一个新的子视图并且永远不会删除它们。

于 2012-12-07T10:33:29.540 回答
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]];
}

做一些类似上面的事情。您可以在哪里移动图像视图。

此外,使用另一个按钮调用合并,您可以随意移动图像,但是当需要合并时,单击一个按钮。这样,您将只调用一次 Merge,它不会对 CPU 造成任何负载。

看起来您是初学者,我强烈建议您遵循一些教程并了解更多关于

  1. 实例变量
  2. 特性
  3. 手势识别器等
于 2012-12-07T16:17:19.883 回答
0

导致 CPU 使用的不是 touchesMoved 或 touchesBegan。绝对是[自合并]。我假设您正在 [self merge] 中执行一些 CPU 密集型工作,并且已经完成了很多次。

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

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

你可以做三件事

  1. 改进合并方法以使其高效。

  2. 使用 Grand Central 调度

阅读关于 dispatch_async(dispatch_get_global_queue, ^{ }); 等等。这将在 Grand Central Dispatch 部分下。

  1. 另一种方法是 [self performSelector:@(merge) afterDelay:0.5s]; 此方法将调用合并,仅每 0.5 秒一次。

然后如果您不希望多次调用相同的方法,或者每次移动都没有必要,就在调用之前

[NSObject cancelPreviousPerformRequestsWithTarget:<#(id)#> 选择器:<#(SEL)#> 对象:<#(id)#>

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

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

于 2012-12-07T13:04:57.603 回答