0

友達、私はUIBezierPathsを使ってフリーハンドで描画していますが、すべてが正常に機能します。これにより、パスをパス配列に格納し、すべてが正常に機能します。レンダリング中は、配列全体をループしてパスをレンダリングしますが、すぐに配列数が増えると、描画中にラグが発生します。以下は私のdrawRectコードです。私がどこで間違っているのかを見つけるのを手伝ってください

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

    UITouch *mytouch=[[touches allObjects] objectAtIndex:0];

    m_previousPoint2 = m_previousPoint1;
    m_previousPoint1 = [mytouch previousLocationInView:self];
    m_currentPoint = [mytouch locationInView:self];

    CGPoint mid1    = midPoint(m_previousPoint1, m_previousPoint2); 
    CGPoint mid2    = midPoint(m_currentPoint, m_previousPoint1);  

    testpath = CGPathCreateMutable();
    CGPathMoveToPoint(testpath, NULL, mid1.x, mid1.y);

    CGPathAddQuadCurveToPoint(testpath, NULL, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y);      


    CGRect bounds = CGPathGetBoundingBox(testpath);   

    CGPathRelease(testpath);


    CGRect drawBox = bounds;

    //Pad our values so the bounding box respects our line width
    drawBox.origin.x        -= self.lineWidth * 2;
    drawBox.origin.y        -= self.lineWidth * 2;
    drawBox.size.width      += self.lineWidth * 4;
    drawBox.size.height     += self.lineWidth * 4;


    CGContextRef context = UIGraphicsGetCurrentContext();
    context = CGLayerGetContext(myLayerRef);


    [self.layer renderInContext:UIGraphicsGetCurrentContext()];      

    [self setNeedsDisplayInRect:drawBox];    

}


- (void)drawRect:(CGRect)rect
{   
    CGContextRef context = UIGraphicsGetCurrentContext();

    if(myLayerRef == nil)
    {            
        myLayerRef = CGLayerCreateWithContext(context, self.bounds.size, NULL);
    }

    [self.layer renderInContext:context];   


    CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2); 
    CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1);


    CGContextMoveToPoint(context, mid1.x, mid1.y);
    CGContextAddQuadCurveToPoint(context, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y); 
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, self.lineWidth);
    CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);

    CGContextSetFlatness(context, 0.1);

    CGContextSetAllowsAntialiasing(context, true);

    CGContextStrokePath(context);

    [super drawRect:rect];  

 }

@borrrdenによる以下の議論に従って更新されたコード

よろしくランジット

4

1 に答える 1

2

WWDC 2012 セッションには、まさにこの問題に関する優れたセッションがあります。それはiOSのパフォーマンスと呼ばれると思います:グラフィックスなど。絶対に観るべきです。

要約すると、パスに保存しないでください。このパス情報を保持する必要はありません。別のコンテキストを保存し (CGLayer が最適です)、そこに描画します (パスにポイントを追加するのと同じように、代わりにコンテキストにポイントを追加します)。次に、drawRect で、そのレイヤーを現在のグラフィックス コンテキストに描画します。また、変更された四角形のみを呼び出すようsetNeedsDisplayにしてください。そうしないと、高解像度のデバイスで問題が発生する可能性が高くなります。

于 2012-07-03T14:43:07.820 に答える