2011-08-09 36 views
2

在我的應用程序中,我有一個UIViewController與其中的子類UIView(和其他幾個元素)。在我的drawRect:方法中,在UIView的內部調用DrawView,我畫了一個表格網格類型的東西,並在網格上繪製了一個CGPoint數組。當用戶在屏幕上點擊時,它會調用touchesBegan:withEvent:並檢查以找到網格上觸摸的最近點,向該陣列添加一個點,drawRect:方法從中抽取點,並調用[self setNeedsDisplay]。當用戶在屏幕上移動他們的手指時,它會檢查點是否從最後一個位置改變,並更新點並根據需要調用[self setNeedsDisplay]核心圖形 - drawRect:沒有得到足夠頻繁的調用

這在模擬器中很好用。但是,當在真正的iPhone上運行時,它運行速度非常緩慢,當您移動手指時,它會畫點。我已經讀過,運行計算將點放在不同線程的位置可以提高性能。有沒有人有這方面的經驗知道這一事實?任何其他的建議,以減少滯後?

回答

4

任何其他的建議,以減少滯後?

是的。請勿使用-drawRect:。這是一個漫長而複雜的原因,但基本上當UIKit看到您在UIView子類中實現了-drawRect:時,渲染經歷了非常緩慢的基於軟件的渲染路徑。當您使用CALayer對象和複合視圖進行繪製時,您可以獲得硬件加速圖形,這可以使您的應用程序FAR更具性能。

+0

很好的答案。但你會怎麼做?用戶不同的視圖每個都有一個圖層或一個視圖有多個子圖層? –

+0

@Sandro無論是會工作,但我可能會使用'UIView'對象而不是'CALayers',因爲這會留下附加手勢識別器,處理ObjC類型而不是CF類型(UIImage vs CGImageRef等)的可能性...... –

+0

謝謝。我有些新鮮,我完全不知道CALayer對象或複合視圖是什麼。我發現了[Apple的CALayer文檔](http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html),但是還有其他教程或文檔是您推薦的嗎?學習這些東西,以及如何使用它們來繪製? –