由畫K線引起的思考

最近興趣所致,想看看股票App中的K線是怎麼畫的,瞭解到畫K線有好幾種方案。原本一開始考慮到用Core Graphics重繪來繪製,但發現網上不少的解決方案都是用了CAShapeLayer來實現,比較少採用CG來重繪實現。故所以對這兩種方案的實現區別探究一下。性能

畫K線大概只有如下這三種方案:內存

  • 經過subView添加
  • 經過Core Graphics繪製
  • 經過CAShapeLayer繪製
  • 經過subView添加
  • 這種方式是最粗暴的,直接把每一個K線當成一個控件,直接經過addSubView添加進去。這種方案優勢是操做簡單,使用門檻低。但缺點也很是明顯,性能很是低下,內存佔用太多。

經過Core Graphics繪製

這種方法的思路不錯,每次數據或顯示發生變化時,從新繪製整個繪製區域。這個方案的優勢很明顯,相對subView來講的低內存佔用,性能也還能夠。可是有個很明顯的缺點:CPU佔用太多容易形成卡頓。 爲何會有這個問題? 舉個例子,對於一個1024 1024的繪製的區域來講,其每次重繪區域大小是是1024 1024 * 4 字節 = 4 MB。也就是說每次重繪都須要從新刷新4MB的內存空間,這對於CPU來講是壓力很多的,特別是對於比較大的重繪來講,很是容易產生卡頓。這個主要是因爲Core Graphics繪的是Bitmap,內存佔用比較大,並且使用CPU來繪製,繪圖效率比較低下。博客

經過CAShapeLayer繪製

這種方案是爲了解決CG方案的缺點的。it

  • CAShapeLayer繪製的是矢量圖,相比CG的bitmap來佔用內存少不少。並且一個CAShapeLayer不須要像普通CALayer同樣建立一個寄宿圖形(bitmap?),因此不管有多大,都不會佔用太多的內存。並且因爲是矢量圖,不會形成像素失真
  • CAShapeLayer使用GPU硬件加速,相對使用CPU的CG來講快上很多

總結

看了以上三個方案後,因爲要顯示大量K線行情,因此不可能纔有方案一。因爲要在一個小屏幕上顯示大量K線,並且每一個K線又比較小,例如顯示百日K線行情這種業務狀況下,使用CG後每次刷新數據容易卡頓,因此方案二不是一種比較好的解決方案。而方案三內存佔用少,又使用GPU加速,對於這種業務場景來講是比較合適的,因此能夠看到不少開源畫K線的項目都是使用CAShapeLayer這種方案的。class

後記

之前寫博客總是想着要寫點有技術含量的東西,如今想來這種想法有點問題。博客這本質,更應該是記錄所想所學,而不是僅僅爲了展現本身所謂的有技術含量的東西,若是都是爲了展現,那爲了寫一篇「充滿技術含量的文章」,會充滿痛苦,並且寫出來的,通常都不滿意。與其這樣,不如看到什麼,整理一下,記錄下來,說不定,之後就變成「有技術含量」了呢?效率

相關文章
相關標籤/搜索