2011-07-28 29 views
2

我試圖在使用CoreGraphics的地圖上繪製雷達數據。之前,我試圖通過在每個單獨的數據點周圍製作路徑,然後填充適當的顏色來逐個繪製每個數據點。所以對於這個方法,我必須有4個位置點和每個數據點的數據值。這樣做的結果太昂貴了,因爲每張圖片的數據點在30,000到80,000之間。使用CoreGraphics在iPhone上繪製徑向數據

雷達數據以徑向格式存儲(360個徑向,每個包含230個數據點)。因此,不是循環遍歷每個數據點,而只是循環遍歷徑向。而不是每個數據點周圍的路徑,我有每個徑向周圍的路徑。然後使用該特定漸變的顏色數組創建並繪製線性漸變(CGGradientCreateWithColors)。

這種方法繪製的速度比以前快很多,但速度還不夠快。與此相關的另一個問題是放大時數據的「平滑度」。漸變中的每個數據點之間的漸變混合,因此您無法看到單個像素。我不希望它這樣做。我認爲這是我最大的表現來自哪裏(計算每個數據點之間的梯度)。我寧願將每個數據點繪製成不連續的顏色。這看起來會更好,它應該表現更好。

有沒有辦法給一個路徑提供一個顏色數組(類似於我對漸變做的),這將會分散地繪製它們。我需要能夠繪製這個,而不必返回繪製各個數據點。

謝謝你在前進, 羅斯

編輯

第一張照片是原始的辦法,我做的繪製(通過繪製每個單獨的數據點)。這就是我最終想要的樣子。

第二張圖片是漸變效果,比以前效率更高(儘管效率不夠高),但看起來不正確。

This

This is using the gradient. Notice how the colors blend along the radials instead of showing each individual data point.

+0

這是現在商店裏的應用程序的任何機會? – valexa

+0

是的,它被稱爲[Storm Spotter](http://itunes.apple.com/us/app/storm-spotter/id329385154?mt=8)。 –

回答

1

我無法想象挺你想畫什麼(這是很難想象的iPhone屏幕上繪製的任何東西80,000有每一件事情比一個像素大....)但這裏有一些想法。

首先,如果您有一致的事情重複繪製,請將其放在CGLayer上。不是CALayerCGLayer。這是一個硬件優化的對象,用於重複「蓋印」相同的事物。如果您需要更改顏色或應用漸變,則可以使用蒙版或合成一個CGImage(後者通常可以更快速地重新使用生成的圖像,而不必縮放任何內容)。

儘可能預先計算您的漸變並將它們存儲在數據結構中。試圖在drawRect:中計算它們通常是主要的性能影響。同樣,預先計算您的路徑,以便您不必在每次繪製時都創建它們。

如果您可以避免縮放圖層,則可以將它們的shouldRasterize設置爲YES,如果您有複雜的圖層,這通常會提高性能。另一方面,如果您需要進行縮放或其他轉換,那麼使用CALayer並應用所需的轉換可能非常快。您也可以將變換應用於整個UIView,但如果您需要轉換大量單獨的東西,那麼這就是CALayer的全部內容。 (到更早的時候,你當然可以繪製一個CGLayerCALayer。)

我不明白你是什麼意思,通過「離散地」繪製一條路徑。路徑是由控制點定義的連續線。


編輯:根據您的修改,我建議您用實驗是一個索引色彩空間(CGColorSpaceCreateIndexed())。這樣,您的漸變不應該包含中間色,並且整個圖形上的計算速度應該更快。

你也應該看看CGShading。 (我相信它適用於iOS,而不僅限於Mac)。它可能比CGGradient更接近你想要的。

+0

我添加了圖片以分散顯示我的意思。 –

+0

這應該做到這一點。謝謝! –

相關問題