2010-05-26 36 views
1

我有一個模型,其中包含用戶繪製的所有線條的NSMutableArraycurvedPaths。線本身也是包含點對象的NSMutableArray。當我繪製彎曲的NSBezier路徑時,我的點數組具有以下結構:linePoint,controlPoint,controlPoint,linePoint,controlPoint,controlPoint等...我認爲有一個數組包含所有點和控制點會比處理2或3個不同的陣列。在一個簡單的繪圖應用程序中優化視圖繪圖代碼

很明顯,我的視圖繪製了它從模型中獲得的路徑,這導致了一個實際問題:有沒有一種方法可以在速度方面優化以下代碼(在視圖的drawRect方法中)?

int lineCount = [[model curvedPaths] count]; 

// Go through paths 
for (int i=0; i < lineCount; i++) 
{ 
    // Get the Color 
    NSColor *theColor = [model getColorOfPath:[[model curvedPaths] objectAtIndex:i]]; 

    // Get the points 
    NSArray *thePoints = [model getPointsOfPath:[[model curvedPaths] objectAtIndex:i]]; 

    // Create a new path for performance reasons 
    NSBezierPath *path = [[NSBezierPath alloc] init]; 

    // Set the color 
    [theColor set]; 

    // Move to first point without drawing 
    [path moveToPoint:[[thePoints objectAtIndex:0] myNSPoint]]; 

    int pointCount = [thePoints count] - 3; 

    // Go through points 
    for (int j=0; j < pointCount; j+=3) 
    { 
     [path curveToPoint:[[thePoints objectAtIndex:j+3] myNSPoint] 
      controlPoint1:[[thePoints objectAtIndex:j+1] myNSPoint] 
      controlPoint2:[[thePoints objectAtIndex:j+2] myNSPoint]]; 
    } 

    // Draw the path 
    [path stroke]; 

    // Bye stuff 
    [path release]; 
    [theColor release]; 
} 

感謝, xonic

回答

4

嘿xon1c,代碼看起來不錯。一般情況下,如果不在特定情況下測量性能,則無法進行優化。

例如,可以說上面的代碼只被調用過一次。它在視圖中繪製一張圖片,並且從不需要重繪。假設上面的代碼需要運行50毫秒。您可以在openGL中重寫它,並在陽光下進行每次優化,並將時間縮短到20毫秒,實際上,您節省的30毫秒對任何人都沒有任何影響,並且幾乎浪費了您的時間並增加了大量代碼 - 這將是更難以維持的膨脹。然而,如果上面的代碼被稱爲每秒50次,並且其中大部分時間是繪製相同的東西,那麼你可以有意義地優化它。

當談到繪圖時,優化的最佳方法是消除不必要的繪圖。

每次你畫你重新創建NSBezierPaths - 他們總是不同?您可能想要維護要繪製的NSBezier路徑的列表,並使其與您的模型保持同步,並僅爲繪製路徑保留drawrect。

您是否正在繪製視圖中不需要重繪的區域? drawrect的參數是需要重繪的視圖的區域 - 您可以測試該視圖(或getRectsBeingDrawn:count :),但是您的情況可能是您知道需要重繪整個視圖。

如果路徑本身並不經常變化,但視圖需要經常重繪 - 例如,當路徑的形狀不變,但它們的位置是動畫並且它們以不同方式重疊時,可以繪製路徑以圖像(紋理),然後在drawrect內,您將繪製紋理到視圖,而不是繪製視圖的路徑。這可以更快,因爲紋理只創建一次,並上傳到視頻內存,這樣可以更快速地繪製到屏幕上。如果這是您需要的待辦事項,您應該查看Core Animation

如果您發現繪製路徑太慢,你可以看看CGPath

因此,從整體上看,它確實取決於你在做什麼。最好的建議是,永遠不要陷入過早的優化。如果你的應用程序對用戶來說實際上並不算太慢,那麼你的代碼就好了。

+0

偉大的一點在那裏!保存路徑並不在我的腦海中,但實際上是一個非常好的主意。事情是,我在整個桌面上都有一個透明的視圖,以便讓用戶在各種窗口上畫畫,或者寫下筆記等等。所以路徑不會經常改變,但是經常被拖動,並且用戶可以擦除一個或多個路徑。我認爲紋理不會完成這項工作。但是現在我已經發現了NSBezierPath的containsPoint:方法,它甚至會優化我的'擦除路徑代碼'! Thx很多老兄! – xon1c 2010-05-26 10:26:21