Ios CALayer vs CGContext,哪种设计方法更好?

Ios CALayer vs CGContext,哪种设计方法更好?,ios,calayer,cgcontext,drawrect,cashapelayer,Ios,Calayer,Cgcontext,Drawrect,Cashapelayer,我一直在做一些iOS绘图的实验。为了做一个实践练习,我编写了一个条形图组件。下面是类图(我不允许上传图片),所以让我用文字来写。我有一个从UIView继承的NGBarChartView,它有两个协议NGBarChartViewDataSource和NGBarChartViewDelegate。代码在 为了绘制条形图,我将每个条形图创建为一个不同的图层。我这样做的原因有两个,第一,我可以创建一个UIBezierPath并将其附加到CAShapeLayer对象上;第二,我可以使用[Layer hit

我一直在做一些iOS绘图的实验。为了做一个实践练习,我编写了一个条形图组件。下面是类图(我不允许上传图片),所以让我用文字来写。我有一个从UIView继承的NGBarChartView,它有两个协议NGBarChartViewDataSource和NGBarChartViewDelegate。代码在

为了绘制条形图,我将每个条形图创建为一个不同的图层。我这样做的原因有两个,第一,我可以创建一个UIBezierPath并将其附加到CAShapeLayer对象上;第二,我可以使用[Layer hitTest]方法轻松跟踪barItem是否被触摸。这个组件工作得很好。然而,我对绘制柱状图的方法并不满意。因此,本说明。我需要以下方面的专家意见

  • 通过使用CAShapeLayer和创建Baritem,我真的不是 使用UIGraphicsContext,这是一个好的设计吗
  • 我的方法将在UIView中创建几个Calayer。有没有 根据性能,限制您可以使用的Calayer的数量 在UIView中创建
  • 如果一个好的替代方法是使用CGContext*方法,那么 确定是否接触了特定路径的正确方法
  • 从动画的角度来看,例如当您 点击它,是图层设计更好还是CGContext设计更好 更好
  • 非常感谢您的帮助。顺便说一句,你可以查看我的代码和评论。我很乐意接受任何改进的建议

    最好的,
    Murali

    在我看来,一般来说,任何一种绘图形状都需要强大的处理能力。用GPU合成缓存的位图比再次绘制所有位图便宜得多。因此,在许多情况下,我们将所有图形缓存到位图中,在iOS中,
    CALayer
    负责此操作

    无论如何,如果位图超过了视频内存限制,Quartz无法一次合成所有层。因此,石英必须在多个相位上绘制单个帧。这需要将一些纹理重新加载到GPU中。这可能会影响性能。我对此不确定,因为众所周知iPhone VRAM与系统RAM集成在一起。不管怎么说,即使是那个案子也需要更多的工作。即使系统内存不足,系统也可以清除现有位图并要求稍后重新绘制

  • CAShapeLayer
    将代替您完成所有的
    CGContext
    (我相信您的意思)工作。如果你觉得需要更低级的优化,你可以自己做

  • 对。显然,任何东西都有性能视图的限制。如果您使用数百层带有大型alpha混合图形的图层,则会导致性能问题。总之,一般来说,这不会发生,因为GPU加速了图层合成。如果你的图形线不是很多,而且它们基本上是不透明的,你就没事了

  • 您所要知道的是,一旦合成了图形图形,就无法将其分解回去。因为合成本身是一种有损压缩优化,所以您只有两个选项(1)在需要变异时重新绘制所有图形。或者(2)制作每个显示元素的缓存位图(如图线)并根据需要合成。这正是Calayer一家正在做的事情

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


  • 我希望这能有所帮助。

    真正了解情况的唯一方法是尝试这两种方法并分析您的表现。。但正如@eonil所建议的,我将从CALayer开始,使用CAShapeLayer对CGPath进行任何渲染。我敢打赌那是最快的,除非是在非常有限的情况下。如果发现遇到性能问题,也可以尝试使用CATiledLayer。