2009-02-02 43 views
0

我有一個背景圖像和一個CGPath,隨着用戶觸摸屏幕而改變。用CGContextDrawImage()繪製圖像,然後在頂部繪製路徑速度不夠快,並且妨礙了觸摸事件的性能。我想要的是有一個位圖緩衝區,並只繪製路徑中的變化。因此,視圖的drawRect()將只是繪製緩衝區。我懷疑我需要使用CGContext s,但我無法完全弄清楚如何去做。有沒有不同的方式來優化這個?石英拉絲優化

編輯:

我每次用戶觸摸屏幕時增加了路徑;所以「路徑變化」是指向現有路徑添加更多點。這就是爲什麼我認爲我可以緩衝圖像並只畫出路徑的「三角」而不是每次繪製整個東西。此刻我的繪圖和事件的邏輯是這樣的:

-(void)drawRect{ 
    //Draw the background image 
    //Draw the whole path 
} 

-(void)touchesMoved{ 
    //Add the touch point to the path 
    [self setNeedsDisplay]; 
} 

繪製背景這樣使得觸摸事件的採樣執行明顯比剛纔繪製的路徑差。

回答

1

如果背景圖像沒有改變(我無法確定它是否確實如此),那麼你應該把背景圖像放在一個不同的CoreAnimation圖層中,圖層上面包含路徑。這可以讓GPU處理合成,而不是在你的-drawRect中完成。在可能的情況下,可以緩存背景圖像,並且唯一需要更新的是路徑(您仍然可以避免完全重新繪製每個幀)。您還可以執行縮放或旋轉路徑等操作,而無需擔心背景圖像的影響。

0

事實上,它已經是它的工作方式了。傳遞給drawRect的上下文將繪製到CALayer中,CALayer會被緩存,直到您做出需要視圖重繪的東西。你提到路徑改變了「隨着用戶觸摸屏幕」 - 你是否在視圖上設置setNeedsDisplay?

如果你每次真的有不同的路徑,那麼你將無法緩衝它。如果它是相同的,只要你不調用setNeedsDisplay,或者會影響它被調用的東西,那麼支持你的視圖的圖層應該被緩衝。我有一大堆這樣的視圖層,所有這些都有很多花哨的CG東西(繪圖和填充路徑,裁剪圖像,色彩等等),性能非常好。

如果您有不同的路徑(可能是用視覺來表示觸摸) - 您可能需要考慮使用替代視圖 - 這些視圖本身不會更改 - 或者可能在單個預渲染視圖上使用視圖動畫?

如果這些都不符合標準,請發佈更多信息以幫助我們瞭解您要做的事情。

0

我不是100%肯定它在iPhone上以這種方式工作,但在等效的Mac OS X類中,setNeedsDisplay:實際上是同步的,所以昂貴的繪圖操作可以殺死循環的性能。嘗試將您的繪圖代碼放置在每秒執行多次的計時器上,而不是在事件處理代碼中明確調用它。

有關更多信息,請參閱this CocoaBuilder thread

0

從編輯它看起來像你正在做某種繪畫應用程序。

在這種情況下,我會嘗試「未知」的建議(將背景圖像放在單獨的圖層/視圖中)。事實上,無論如何我都會這麼做。 你在使用CGPath嗎?如果不是,它也可能值得這樣做。

如果你仍然有問題,它可能是值得分離出目前的「編輯」(任何行連續快速拉)到自己的道路(在自己的層/視圖),並將它們添加到在合適的空閒時間之後的主要路徑(使用定時器)。