降低应用程序的 CPU 使用率

Posted

技术标签:

【中文标题】降低应用程序的 CPU 使用率【英文标题】:Lower the CPU usage of an app 【发布时间】:2012-12-07 10:16:06 【问题描述】:

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

任何帮助都将不胜感激。

谢谢

【问题讨论】:

请显示您用于动画的代码。 @sosborn check...我已经分享了代码 【参考方案1】:

不要在您的 touchesBegan 代码中调用 touchesMovedtouchesMovedios 调用以响应被移动的触摸

touchesEnded 也是如此 - 当用户将手指从屏幕上移开时调用它

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

【讨论】:

嗨,感谢您的支持...我对我的代码进行了一些更改,已删除 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 并在移动委托中调用了我的合并,它仍然显示大量 CPU 使用率并且应用程序崩溃了。 @DeepakKhiwani 查看我的更新答案。您可能应该创建一个 UIImageView 并放在其中,然后更新其中的图像,而不是每次都添加一个新的 UIImageView【参考方案2】:
-(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 造成任何负载。

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

    实例变量 属性 手势识别器等

【讨论】:

【参考方案3】:

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

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

请发布您在合并方法中所做的代码。

你可以做三件事

    改进合并方法,提高效率。

    使用 Grand Central 调度

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

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

然后如果你不希望同一个方法被调用这么多次,或者每次移动都没有必要,就在调用之前

[NSObject cancelPreviousPerformRequestsWithTarget: 选择器: 对象:

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

但同样,这完全取决于您要做什么。

【讨论】:

如果可以的话,我也强烈建议您使用手势识别器,因为即使是专家也会发现使用触摸级 API 很困难。 真的很高兴看到你对我的要求的回答......好吧,我已经发布了我想要做的代码......请看看,如果有任何错误,请告诉我那里。谢谢

以上是关于降低应用程序的 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

fpga中组合逻辑门占用资源过多怎么降低

Linux——Linux驱动之使用等待队列降低CPU的占用率应用实战(阻塞与非阻塞等待队列的基本概念相关函数代码实战)

Linux——Linux驱动之使用等待队列降低CPU的占用率应用实战(阻塞与非阻塞等待队列的基本概念相关函数代码实战)

如何实时查看m1 macbook cpu频率?

怎么降低echarts地图模块占用cpu高的问题

怎么能降低CPU的使用率??