我一直在尝试iOS绘图。为了做一个实际练习,我写了一个BarChart组件。以下是类图(好吧,我不允许上传图像)所以让我用文字写。我有一个NGBarChartView,它继承自UIView有2个协议NGBarChartViewDataSource和NGBarChartViewDelegate。代码位于https://github.com/mraghuram/NELGPieChart/blob/master/NELGPieChart/NGBarChartView.m
为了绘制barChart,我创建了每个barChart作为不同的CAShapeLayer。我这样做的原因有两个,首先我可以创建一个UIBezierPath并将其附加到CAShapeLayer对象和两个,我可以通过使用[Layer hitTest]方法轻松跟踪是否触摸了一个barItem。该组件运行良好。但是,我对绘制barCharts的方法感到不舒服。因此这个说明。我需要以下专家意见
非常感谢帮助。顺便说一句,你可以自由地查看我的代码和评论。我很乐意接受任何改进的建议。
最佳, 穆拉利
答案 0 :(得分:15)
IMO,一般来说,任何一种绘图形状都需要繁重的处理能力。使用GPU合成缓存位图比再次绘制所有这些位图非常便宜。因此,在许多情况下,我们将所有绘图缓存到位图中,而在iOS中,CALayer
负责这一点。
无论如何,如果您的位图超出了视频内存限制, Quartz 无法一次合成所有图层。因此,Quartz必须在多个阶段绘制单帧。这需要将一些纹理重新加载到GPU中。这可能会影响性能。我不确定这一点,因为已知iPhone VRAM与系统RAM集成。无论如何,即使在这种情况下,它仍然需要更多的工作。如果即使系统内存不足,系统也可以清除现有的位图并要求稍后重新绘制它们。
CAShapeLayer
会完成所有CGContext
(我相信你的意思是这样)而不是你。如果你觉得需要更低级别的优化,你可以自己做。
是。显然,一切都受到性能观点的限制。如果您使用具有大型alpha混合图形的数百个图层,则会导致性能问题。无论如何,通常情况下,它不会发生,因为GPU加速了图层组合。如果您的图表线不是那么多,并且它们基本上是不透明的,那么你会没事的。
所有你必须知道的是,一旦图形绘图被合成,就无法将它们分解回来。因为组合本身是有损压缩的一种优化,所以你只有两个选项(1)在需要变异时重绘所有图形。或者(2)制作每个显示元素的缓存位图(如图线),并根据需要进行复合。这就是CALayers正在做的事情。
绝对基于图层的方法要好得多。任何类型的自由形状绘图(即使它在GPU内完成)也需要比GPU更简单的位图合成(将成为两个纹理三角形)更多的处理能力。当然,除非您的图层不超过视频内存限制。
我希望这会有所帮助。