2

私は、ユーザーが数学の問題を解こうとしているときに、ユーザーが指でスクラッチ作業を行うことができる数学関連のアクティビティを作成しています。ただし、指をすばやく動かすと、線が指の後ろに少し遅れていることに気付きます。パフォーマンスで見落としていた部分があるのか​​、それとも単に足りない部分があるのか​​と思っていましたtouchesMoved(速く動かないと完全にスムーズで素晴らしいです)。私はを使用してUIBezierPathいます。まず、次のようにinitメソッドで作成します。

myPath=[[UIBezierPath alloc]init];
myPath.lineCapStyle=kCGLineCapSquare;
myPath.lineJoinStyle = kCGLineJoinBevel;
myPath.lineWidth=5;
myPath.flatness = 0.4;

次に、drawRectで:

- (void)drawRect:(CGRect)rect
{
    [brushPattern setStroke];
    if(baseImageView.image)
    {
        CGContextRef c = UIGraphicsGetCurrentContext();
        [baseImageView.layer renderInContext:c];
    }

    CGBlendMode blendMode = self.erase ? kCGBlendModeClear : kCGBlendModeNormal;
    [myPath strokeWithBlendMode:blendMode alpha:1.0];
}

baseImageViewは、結果を保存するために使用するもので、多くのパスを描画する必要がありません(しばらくすると非常に遅くなります)。これが私のタッチロジックです:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
    [myPath moveToPoint:[mytouch locationInView:self]];

}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{    
    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];
    [myPath addLineToPoint:[mytouch locationInView:self]];
    [self setNeedsDisplay];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{    
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0f);
    CGContextRef c = UIGraphicsGetCurrentContext();
    [self.layer renderInContext:c];

    baseImageView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [myPath removeAllPoints];
    [self setNeedsDisplay];
}

このプロジェクトはエンタープライズアプリとしてリリースされる予定なので、iPad2にのみインストールされます。ターゲットiOSは5.0です。これからもう少しスピードを絞る方法についての提案をいただければ幸いです。

4

2 に答える 2

3

もちろん、Instrumentsで実行することから始めて、ホットスポットを探す必要があります。次に、変更を加えて再評価し、その影響を確認する必要があります。そうでなければ、あなたはただ推測しているだけです。そうは言っても、経験からのいくつかのメモ:

  • パスに多くの要素を追加すると、非常にコストがかかる可能性があります。addLineToPoint:あなたがホットスポットであることが判明しても、私は驚かないでしょう。それは私のためでした。
  • UIImageViewを使用してシステムをバックアップするのではなく、おそらくCGLayerにレンダリングします。CGLayersは、特定のコンテキストにレンダリングするために最適化されています。
  • 各ステップでパスをレイヤーにレンダリングするだけでなく、パスを蓄積するのはなぜですか?そうすれば、パスが2つ以上の要素(move、addLine)になることはありません。通常は2段階のアプローチが使用されるため、元にたりなどを処理できます。
  • 不要なUIBezierPath機能をオフにしていることを確認してください。特に、ドキュメントの「描画プロパティへのアクセス」のセクションを参照してください。UIBezierPathではなくCGMutablePathへの切り替えを検討してください。同じように構成した場合、実際には高速ではありませんが、デフォルト設定ではより多くの機能がオフになるため、デフォルトでは高速です。(これらのほとんどはすでに設定されています。Instrumentsで少し実験して、それらがどのような影響を与えるかを確認することをお勧めします。)
于 2012-05-29T14:07:33.103 に答える
1

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_freehand-drawing/

このリンクは、曲線をより滑らかにする方法を正確に示しています。このチュートリアルでは、手順を追って説明します。そして、曲線に(touchesMovedメソッドで)いくつかの中間点を追加して曲線を滑らかにする方法を簡単に説明します。

于 2012-11-27T13:00:56.603 に答える