由画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

后记

之前写博客总是想着要写点有技术含量的东西,如今想来这种想法有点问题。博客这本质,更应该是记录所想所学,而不是仅仅为了展现本身所谓的有技术含量的东西,若是都是为了展现,那为了写一篇“充满技术含量的文章”,会充满痛苦,并且写出来的,通常都不满意。与其这样,不如看到什么,整理一下,记录下来,说不定,之后就变成“有技术含量”了呢?效率

相关文章
相关标签/搜索