2012-02-24 95 views
0

我想知道我正在嘗試的只是一個壞主意。我目前正在單點觸摸。是否可以將屏幕大小(在我的iPhone 4上大約爲320x460)的緩衝區繪製到大小相等的UIView上,以便對最終用戶來說,對該緩衝區的動畫更改看起來很流暢(需要每個繪圖大約20ms) 。石英性能繪圖大緩衝區

我已經嘗試許多不同的實現。迄今爲止最好的一個似乎是使用內存中的CGLayer並調用context.DrawLayer()將其應用於Draw()中的視圖。但即使這樣,每個DrawLayer也需要30-40毫秒。

我在寫我自己瓦片圖像控制,並且除了性能,這個想法運作良好。我只是不知道如何快速將緩衝區放到UIView上。

任何想法?

回答

1

我一直在處理自定義視圖很多最近,我已經有一堆的性能問題,太。

所有這些性能問題,可以通過確定需要重繪的元素來解決,而且,更重要的是,做的元素需要重新繪製。

然後,在層爲單獨的子層分割的內容,如果需要只重繪它們。好處是,對於這些單獨的圖層,動畫等非常流暢。 (他們的內容只是一個簡單的位圖,直到你告訴它纔會改變)。

唯一的限制我都已經跨越了,你不能使用CG混合模式(例如乘)的子層。據我所知,這是不可能的。您只能在用於繪製子圖層內容的CG代碼內部使用這些混合模式,但在此之後它們都是在「正常」模式下編寫的。

+0

唯一棘手的部分是,我需要的緩衝區不斷地更新。我一直在裝載新的圖像切片(認爲是Google地圖),所以緩衝區變化很大。 – Aaron 2012-02-27 16:27:24

+0

我明白了......我很抱歉,我無法真正幫助你解決這個問題。另一個想法:你的圖層是否比屏幕大得多?在我的例子中,這是一個巨大的性能...另外:你確定繪圖例程是慢的部分嗎? (而不是代碼加載瓷磚?) – 2012-02-28 11:50:30

+0

我想我已經找到了一個很好的平衡,通過使用CALayers和加載新的緩衝區時,用戶停止移動的東西。看起來好像將位圖繪製到上下文始終是瓶頸。 – Aaron 2012-02-29 23:18:37

1

這真的取決於你是畫什麼。

如果你只是畫一個實心填充顏色,這不應該是一個問題。問題是你有多大的表面變化,以及你如何改變它。

再次,它取決於你畫什麼,你是否可以卸載一些工作交給GPU的。例如,如果您的界面的靜態部分保持不變,或者獨立進行動畫/更新,則可以對這些區域使用不同的圖層,並讓GPU組成這些圖層。

層具有它們是由GPU合成的優勢,它們通過自己的位圖支持。一旦您繪製到圖層的表面,操作系統會將結果緩存在GPU中,並同時組合所有圖層。

然後你就可以判斷這實際上需要你的應用程序的部分重新繪製和重繪每幀的那些部分。

但同樣,它真的將取決於很多關於你正在嘗試做的。

+0

這是我一直在採取的方法。問題是我的圖層需要不斷更新。我正在嘗試實現類似於Google地圖的外觀。我還沒有想出如何獲得該層/緩衝區來保持更新並保持性能。如果它保持不變,那麼我沒有問題。 – Aaron 2012-02-27 16:26:29