2010-08-09 62 views
1

我有一個由許多圖像組成的自定義UIView,它們的位置在響應用戶觸摸時發生了變化。 該視圖必須跟蹤用戶觸摸,並且我正在體驗這種視圖繪製中的性能瓶頸,使我無法實時跟蹤輸入。提高自定義UIView的繪圖性能

開始時我在[UIView drawRect:]方法中畫了一切,當然這太慢了,因爲即使沒有必要,一切都被重新繪製。 然後,我使用了更多的CALayers來更新只更改的圖層,這給了我更好的響應能力。 但是,當我不得不在一個圖層上多次繪製相同的圖像時,它需要長達500ms。

由於圖像被放置在固定的位置,有沒有辦法預先繪製它們?我是否應該考慮將它們放入許多CALayers中並隱藏/顯示它們? 另外,我不明白爲什麼[CALayer setNeedsDisplayInRect:]存在,但委託(顯然)沒有辦法知道什麼是無效矩形優化繪圖。


解決方案

繼答案我終於創建了圖片許多CALayers並設置contents屬性第一次,在展示層的意見。這是一個懶惰加載妥協:我第一次嘗試在創建時設置每個圖層的內容,但這導致在程序啓動時預先繪製任何可能的圖像,將應用程序凍結幾秒鐘。

回答

0

從文檔 - [CALayer的drawInContext:]:

默認實現什麼都不做。可以剪輯上下文以保護有效的圖層內容。希望查找要繪製的實際區域的子類可以調用CGContextGetClipBoundingBox。正在更新內容屬性時由顯示方法調用。

display的默認實現在自動創建的上下文中調用drawInContext:大概設置邊界框(這大概傳遞給drawRect :)。

如果您正在繪製多個靜態圖像,我只需將它們粘貼到它自己的UIView中;我認爲開銷不大(如果是的話,CALayer開銷應該更小)。如果他們都動畫,我一定會使用UIView/CALayer。如果其中一些動畫不多(很多),並且您注意到顯着的緩慢,則可以預先渲染這些動畫。這是在drawRect(或類似的)渲染和GPU上的圖層合成之間的平衡,但總的來說,我認爲後者要快得多。