CALayer vs CGContext,这是一种更好的设计方法吗?

时间:2011-09-02 17:40:15

标签: ios calayer cgcontext drawrect cashapelayer

我一直在尝试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的方法感到不舒服。因此这个说明。我需要以下专家意见

  1. 通过使用CAShapeLayer并创建BarItems,我真的不是 使用UIGraphicsContext,这是一个很好的设计吗?
  2. 我的方法将在UIView中创建几个CALayer。有没有 根据表现,限制你可以使用的CALayers数量 在UIView中创建。
  3. 如果一个好的选择是使用CGContext *方法,那么,最新的
  4. 确定特定路径是否被触及的正确方法
  5. 从动画的角度来看,比如当你Bar Bar Bar Bar Bar 点击它,更好的层设计或CGContext设计 更好。
  6. 非常感谢帮助。顺便说一句,你可以自由地查看我的代码和评论。我很乐意接受任何改进的建议。

    最佳, 穆拉利

1 个答案:

答案 0 :(得分:15)

IMO,一般来说,任何一种绘图形状都需要繁重的处理能力。使用GPU合成缓存位图比再次绘制所有这些位图非常便宜。因此,在许多情况下,我们将所有绘图缓存到位图中,而在iOS中,CALayer负责这一点。

无论如何,如果您的位图超出了视频内存限制, Quartz 无法一次合成所有图层。因此,Quartz必须在多个阶段绘制单帧。这需要将一些纹理重新加载到GPU中。这可能会影响性能。我不确定这一点,因为已知iPhone VRAM与系统RAM集成。无论如何,即使在这种情况下,它仍然需要更多的工作。如果即使系统内存不足,系统也可以清除现有的位图并要求稍后重新绘制它们。

  1. CAShapeLayer会完成所有CGContext(我相信你的意思是这样)而不是你。如果你觉得需要更低级别的优化,你可以自己做。

  2. 是。显然,一切都受到性能观点的限制。如果您使用具有大型alpha混合图形的数百个图层,则会导致性能问题。无论如何,通常情况下,它不会发生,因为GPU加速了图层组合。如果您的图表线不是那么多,并且它们基本上是不透明的,那么你会没事的。

  3. 所有你必须知道的是,一旦图形绘图被合成,就无法将它们分解回来。因为组合本身是有损压缩的一种优化,所以你只有两个选项(1)在需要变异时重绘所有图形。或者(2)制作每个显示元素的缓存位图(如图线),并根据需要进行复合。这就是CALayers正在做的事情。

  4. 绝对基于图层的方法要好得多。任何类型的自由形状绘图(即使它在GPU内完成)也需要比GPU更简单的位图合成(将成为两个纹理三角形)更多的处理能力。当然,除非您的图层不超过视频内存限制。

  5. 我希望这会有所帮助。

相关问题