0

CPU使用率に問題があります。アプリを起動すると、アニメーションが適切な速度で開始され、突然のアニメーション速度がすべて低下し、アプリがクラッシュします。しかし、Activity Monitor(Instrument)でアプリをチェックしたところ、アプリは約80%〜90%のCPUを使用しています。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でください。移動されたタッチに応答して iOS によって呼び出されますtouchesBegantouchesMoved

同様に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 を 1 回だけ呼び出すだけで、CPU に負荷がかかることはありません。

あなたは初心者のようです。いくつかのチュートリアルに従って、詳細を学ぶことを強くお勧めします。

  1. インスタンス変数
  2. プロパティ
  3. ジェスチャーレコグナイザーなど
于 2012-12-07T16:17:19.883 に答える
0

CPU 使用率の原因となっているのは touchesMoved または touchesBegan ではありません。間違いなく【セルフマージ】です。[自己マージ] で CPU を集中的に使用するジョブを実行していて、それが何度も実行されていると想定しています。

アプリが応答するようにするには、CPU を集中的に使用するジョブを別のスレッドで実行する必要があります。また、すべての動きで何かをしている場合は、遅くなりすぎる可能性があります。

マージメソッドで行っていることのコードを投稿してください。

できることは3つ

  1. マージ方法を改善して効率化します。

  2. グランドセントラルディスパッチを使用

dispatch_async(dispatch_get_global_queue, ^{ }); について読んでください。など。これは、Grand Central Dispatch セクションの下になります。

  1. 別の方法は、 [self performSelector:@(merge) afterDelay:0.5s]; を実行することです。このメソッドは、0.5 秒ごとに 1 回だけマージを呼び出します。

そして、同じメソッドを何度も呼び出したくない場合、またはすべての移動で必要でない場合は、その呼び出しの直前に

[NSObject cancelPreviousPerformRequestsWithTarget:<#(id)#> セレクター:<#(SEL)#> オブジェクト:<#(id)#>

cancel メソッドは、以前の呼び出しをキャンセルし、メソッドを再度呼び出します。

しかし、繰り返しになりますが、それはあなたが何をしようとしているのかにかかっています。

于 2012-12-07T13:04:57.603 に答える