2011-03-22 1 views
0

몇 가지 클래스가있는 기본 그리기 앱을 개발 중입니다. 이 중 하나는 사용자가 그릴 수있는 줄에 정보를 저장하는 "Line"클래스입니다. 사용자가 화면을 드래그하면 손가락이 움직일 때마다 선이 만들어 지므로 손가락을 따라 선이 그려집니다. 모든 라인 객체를 NSArray에 저장하고 무언가가 바뀔 때마다 다시 그립니다. 그러나 어레이가 계속 커지기 시작하고 궁극적으로 속도가 느려지 기 시작합니다. 새로운 라인을 그릴 수있는 방법이 있을까요?효율적인 드로잉 저장 방법?

편집 : 대답을 읽어보십시오. 그러나 setNeedsDisplayInRect:은 작동하지 않는 것 같습니다. 그래서처럼 호출 오전 :는 "라인은"데이터 모델의 포인트 단지 한 쌍의 경우

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    for (UITouch *t in touches) { 
     //add line to array w/ x and y values from touch 
     [self setNeedsDisplayInRect:[self rectForLine:line]]; 
    } 
} 

-(CGRect)rectForLine:(Line*)line { 
    CGFloat x1 = [line begin].x; 
    CGFloat y1 = [line begin].y; 
    CGFloat x2 = [line end].x; 
    CGFloat y2 = [line end].y; 
    CGFloat originX = (x1>x2) ? x1 : x2; 
    CGFloat originY = (y1<y2) ? y1 : y2; 
    CGFloat diffX = ((x1>x2) ? x1 : x2) - originX; 
    CGFloat diffY = ((y1>x2) ? y1 : y2) - originY; 
    return CGRectMake(originX, originY, diffX, diffY); 
} 

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, 10.0); 
    CGContextSetLineCap(context, kCGLineCapRound); 
    //[[UIColor blackColor] set]; 
    for (Line *line in completeLines) { 
     if (CGRectContainsPoint(rect, [line begin]) && CGRectContainsPoint(rect, [line end])) { 
      //draw line onto the screen 
     } 
    } 
+0

"작동하지 않는 것 같습니다"라고 정의하십시오. 최소한 구현에 몇 가지 문제가 있지만 처음부터 어디서부터 시작해야하는지 알려주세요. –

+0

'setNeedsDisplay'를 호출 할 때까지 아무 것도 그려지지 않습니다. 그걸 꺼내면 아무것도 그릴 수 없습니다. – Jumhyn

+0

1. 유효하지 않은 rect는 실제로 합리적으로 보입니까? drawRect가 호출되고 있습니까? 2. rectForLine에는 나머지 알고리즘에 대해 언급하지 않고 diffY 계산에서 적어도 하나의 명백한 오자가 있습니다. 3. 라인이 rect에 있는지 여부에 대한 테스트가 잘못되었습니다. 라인이 rect에서 지나가는 지 여부를 확인해야합니다. 4. 너비가 10px 인 경우이를 고려하여 유효하지 않은 rect 외부를 채워야합니다. –

답변

2

, 즉 당신을 늦추고 부분이 아니다.

O (n^2) 또는 매우 구체적으로 Schlemiel-the-Painter's algorithm 인 모든 행을 다시 그리는 것이 문제입니다.

가장 간단한 개선 사항은 UIView의 -drawRect: 내부에 드로잉한다고 가정 할 때 새 행이 포함 된 rect 만 무효화하고 다시 그립니다. 시작 지점과 끝 지점을 기준으로 -setNeedsDisplayInRect:에 보낼 잘못된 rect를 만든 다음 drawRect에서 모든 선을보고 rect 안에있는 선만 그립니다. 이것은 드로잉 성능을 선의 크기와 훨씬 적은 정도로 제한합니다. 드로잉은 이미 존재합니다.

+0

더 많은 정보로이 답변을 시도했습니다. – Jumhyn