2009-07-14 56 views
6

我在寫一個應用程序,它使用您的手指繪製簡單的圖表。我有它的大部分工作,但現在我試圖優化其性能。當用戶快速揮動手指時,我無法捕捉足夠的觸摸事件來繪製平滑的路徑。爲iPhone SDK優化繪圖(帶手指觸摸)應用程序

這是我目前的做法:

1)我的子類一個UIView並添加了一個poroperty到CGLayer(被懶洋洋地創建,其大小與我UIView相同)。 2)我的UIView子類通過在實例變量中存儲當前觸摸點和最後一個觸摸點來響應觸摸事件。 3)我的視圖的setNeedsDisplay被調用,並且在繪製矩形中,執行以下操作: - 從前一個觸摸位置到當前觸摸位置繪製一條線到CGLayer - 一次繪製整個CGLayer到我的視圖上下文

的主要問題是,當用戶掃描快,我得到相對較少的觸摸事件,所以我在觸摸之間繪製線條很長,使得路徑看鋸齒狀不順利。

我的問題:

1)是否的drawRect(在我UIView子類)和我UIView子類我的觸摸事件處理程序被調用在同一個線程?即我可以不得不執行線程(一個在觸摸事件中,另一個在我的繪製矩形中)?

如果沒有 - 做觸摸事件被排隊時被調用的drawRect?我該如何提高性能 - 簡單地提高drawRect的性能?

如果是的話 - 我怎樣才能得到更多的觸摸事件發生,所以我可以得出一個平滑的路徑?

謝謝。

回答

4

另一種方法是插入採樣點之間的曲線。當手指拖動開始時,開始採集採樣點。隨着點數的增加,重畫線條。用兩點繪製一條直線,用三條或更多條曲線繪製。當兩個點位於定義的距離內時,您可以重新開始該過程。這將允許您在一個動作中繪製兩個弧線(像'm') - 當您改變方向時,您自然會在中間暫停,可能足夠長時間處理兩個或更多個樣本。

3

drawRect在主線程中被調用。但你不必這樣做。您可以使用主線程來收集UI事件並在後臺線程上執行繪圖。只要有新的觸摸並在其自己的CGBitmapContext中開始繪圖操作,後臺線程就會得到通知。然後你創建一個CGImage並把它交給View:view.layer.contents = drawingImage

如果需要更高的性能,可以考慮使用OpenGL繪圖。

+0

所以我的drawRect和我的觸摸事件處理程序都得到所謂的主線程上? 你是否建議每次觸摸事件發生時,我應該開始一個新的線程,並在該線程中做我的繪圖? – aloo 2009-07-14 17:19:10

1

烏爾都語童謠,你必須找到一個解決方案,以他作爲我有同樣的問題。我也發現agreat教程http://www.ipodtouchfans.com/forums/showthread.php?t=132024但它也有同樣的問題,如果你快速繪製,說一個圓圈,繪圖不是很平滑。它幾乎像iPhone一樣無法跟上,不幸的是這必須使用核心顯卡。

0

我嘗試添加

CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound); 

但什麼也沒做。看來我們得弄清楚貝塞爾曲線

相關問題