首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CALayer vs CGContext,哪种设计方法更好?

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

Stack Overflow用户
提问于 2011-09-02 17:40:14
回答 1查看 5.2K关注 0票数 14

我一直在做一些iOS绘图的实验。为了进行实际练习,我编写了一个BarChart组件。下面是类图(嗯,我不允许上传图片),所以让我用文字来写。我有一个NGBarChartView,它继承自UIView,有两个协议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中创建几个CALayers。根据性能,您可以在CALayers中创建的UIView的数量是否有限制。
  3. 如果一个好的替代方法是使用CGContext*方法,那么从动画的角度判断是否有特定路径被触摸到
  4. 的正确方法,例如当您点击它时会闪烁的条条,是层设计更好还是CGContext设计更好。

我们非常感谢你的帮助。顺便说一句,您可以自由地查看我的代码和注释。我很乐意接受任何改进的建议。

最好的,Murali

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-11 20:09:39

一般来说,任何形状的绘图都需要很大的加工能力。用GPU合成缓存的位图比再次绘制它们便宜得多。因此,在许多情况下,我们将所有的绘图缓存到一个位图中,而在iOS中,CALayer负责这一点。

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

  1. CAShapeLayer将完成所有的CGContext(我相信您是指这个),而不是您。如果你觉得需要更低级别的optimization.
  2. Yes.,你可以自己做。显然,一切都受到性能视图的限制。如果您使用的是数百个具有大型alpha混合图形的层,则会导致性能问题。无论如何,通常情况下,它不会发生,因为层组成是加速的GPU。如果你的图形线不是那么多,而且它们基本上是不透明的,你会没事的。
  3. 你需要知道的是,一旦图形绘图被合成,就没有办法将它们分解回去。因为组合本身是一种有损压缩的优化,所以只有两个选项(1)在需要变异时重新绘制所有图形。或者(2)为每个显示元素(如图形线)制作缓存的位图,并根据您的需要进行组合。这正是基于doing.
  4. Absolutely层的CALayers方法更好的地方。任何形式的自由形状绘图(甚至它是在GPU内完成)都需要比GPU简单的位图合成(这将成为两个纹理三角形)更多的处理能力。当然,除非您的层没有超过视频内存限制。

我希望这能帮到你。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7287254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档