降低应用程序的 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
代码中调用 touchesMoved
。 touchesMoved
被 ios 调用以响应被移动的触摸
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 使用率的主要内容,如果未能解决你的问题,请参考以下文章
Linux——Linux驱动之使用等待队列降低CPU的占用率应用实战(阻塞与非阻塞等待队列的基本概念相关函数代码实战)