2011-03-22 60 views
0

我正在開發一個有幾個類的基本繪圖應用程序。其中之一是一個「線」類,它在用戶可以繪製的線上存儲一些信息。當用戶在屏幕上拖動時,會爲其手指的每次移動創建一條線,因此會在手指之後繪製一條線。我將所有線對象存儲在一個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

請定義「似乎沒有工作」。你的實現至少有幾個問題,但告訴我你首先看到的是我們知道從哪裏開始。 – 2011-03-23 00:09:33

+0

直到我調用'setNeedsDisplay'時才繪製任何東西。考慮到這一點,一點都沒有吸引。 – Jumhyn 2011-03-23 00:15:10

+0

1.您的無效折戟實際上看起來是否合理? drawRect被調用了嗎? 2.您的rectForLine在diffY計算中至少有一個明顯的拼寫錯誤,沒有對算法的其餘部分進行評論。 3.你的測試是否是一條線是錯誤的 - 你需要檢查一條線是否通過一個矩形,不僅僅是一條線開始還是結束。 4.如果你有10px寬的線條,你需要填充無效矩形的外部來考慮這一點。 – 2011-03-23 00:24:14

回答

2

如果「行」只是數據模型中的一對點,那不是減慢速度的部分。

你的性能問題是你重新繪製了每一行被添加的整個東西,這是O(n^2)或者非常特別的是Schlemiel-the-Painter's algorithm

假設您在UIView的-drawRect:內進行繪圖,最簡單的改進可能只是使包含新行的矩形無效並重新繪製。根據開始點和結束點,您可以創建無效矩形以發送至-setNeedsDisplayInRect:,然後在drawRect中查看所有行,並僅繪製位於矩形內的那些行。這將您的繪製性能限制爲線條的大小,並且程度更低,即「已經存在」的繪圖。

+0

試了一下,編輯回答更多的信息。 – Jumhyn 2011-03-23 00:07:34