2012-10-12 3 views
1

UIBezierPath에 많은 (10000+) 줄을 추가하는 루프가 있습니다. 이것은 괜찮은 것처럼 보이지만 일단 베 지어 패스를 시도하고 렌더링하면 장치가 매우 느리게 움직입니다. 내 경로에 너무 많은 행을 추가했기 때문입니까? UIBezierPath에UIBezierPath 경로가 너무 많음 = 너무 느림?

추가 라인 - 단순화 : (이 잘 보인다)

[path moveToPoint:CGPointZero]; 

    for (int i = 0; i < 10000; i++) {  
      [path addLineToPoint:CGPointMake(i, i)]; 
    } 

(롭 제안) BeizerPath 렌더링 -이 느린 것 같다.

- (void)drawBezierAnimate:(BOOL)animate 
{ 
    UIBezierPath *bezierPath = path; 

    CAShapeLayer *bezier = [[CAShapeLayer alloc] init]; 

    bezier.path   = bezierPath.CGPath; 
    bezier.strokeColor = [UIColor blueColor].CGColor; 
    bezier.fillColor  = [UIColor clearColor].CGColor; 
    bezier.lineWidth  = 2.0; 
    bezier.strokeStart = 0.0; 
    bezier.strokeEnd  = 1.0; 
    [self.layer addSublayer:bezier]; 

    if (animate) 
    { 
     CABasicAnimation *animateStrokeEnd = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; 
     animateStrokeEnd.duration = 100.0; 
     animateStrokeEnd.fromValue = [NSNumber numberWithFloat:0.0f]; 
     animateStrokeEnd.toValue = [NSNumber numberWithFloat:1.0f]; 
     [bezier addAnimation:animateStrokeEnd forKey:@"strokeEndAnimation"]; 
    } 
} 

품질 평가 점수 : 나는 너무 빨리 너무 많은 경로를 추가 해요 때문에

1)이 있습니까?

2) 여러 색상의 다양한 라인을 그려야합니다. 그래서 여러 개의 (10000+) UIBezierPath를 생성해야한다고 가정합니다. 이렇게하면 장치가 크게 느려지 는가?

3) 어떻게이 문제를 해결할 수 있습니까?

미리 도움을 주셔서 감사합니다.

+0

아, 또 다른 q를 생각해 봅니다 : drawRect에 코드의 드로잉 부분을 포함 시키면 차이가 있습니까? – HHHH

+0

아마도 OpenGL을 사용해보아야할까요? –

답변

0

나는이 런을 충분히 빠르게 실행할 수있는 방법이 없다고 생각합니다.

한 번만 렌더링 (이미지 버퍼로) 할 수 있습니다. 그러나 애니메이션은 없습니다.

문서는 경로 내의 포인트 수에 제한을 두지 않지만 그 중 수천 가지를 사용하면 의 모든 값이 이상이어야합니다.

여기에 OpenGL이 유용 할 수 있습니다. 아마도 누군가가 소리를 지르고 이에 대해 조언 할 수 있습니다.

UIKit 만 사용하면 여러 캐시 계층에서 이미지를 작성해야 할 수 있습니다.

+0

의미가 있습니다 - Open GL을 살펴 보겠습니다. 감사! – HHHH

1

나는 안티 앨리어싱 때문에 UIBezierPath가 느리다는 것을 발견했다. 내 솔루션은 다양한 드래그 작업 중에 앤티 엘리 어싱을 끄고 제스처를 다시 그리는 작업을 완료 한 후에 앤티 엘리 어싱을 해제하는 것입니다.

CGContextSetShouldAntialias (context, ...)를 사용하여이 작업을 수행 할 수 있습니다.

+0

렌더링은 빨라지지만 품질은 낮아지고 1000 점 이상은 여전히 ​​최대입니다. – Adobels