【问题标题】:draw In Separate layers-objective c core graphics画在单独的层-objective c 核心图形
【发布时间】:2010-12-31 03:24:51
【问题描述】:
我正在使用核心图形为 iphone 开发一个图表应用程序。我的要求如下。
我已经在 drawRect 方法中实现了我所有的绘图功能。当图表中发生一些更新时,我需要调用 [self setNeedsDisplay:true] 并从一开始就调用 drawRect 方法。(意味着它执行 drawRectMethod 中的所有方法。所以在触摸事件中绘图不太流畅。所以我需要在drawRect方法中绘制一些特定的部分而不是所有的部分。这可以用核心图形吗?
【问题讨论】:
标签:
objective-c
core-graphics
【解决方案1】:
不清楚您所说的“分离层”是什么意思,但从您的问题来看,我假设您的意思是 -drawRect: 目前是一个大而复杂的函数,它进行大量计算,因此运行速度太慢,因为它得到叫了很多。你没有提到 CALayer,所以我假设你在这里不是指实际的层。
解决方案是将您的计算移出-drawRect:。只有当数据实际发生变化时,您才应该计算所需的一切。在-drawRect: 中,您应该使用预先计算的值,这应该会更快。
例如,既然您提到了 Core Graphics,我假设您使用的是 CGPath 之类的东西。您应该仅在数据更改时计算您的 CGPath,然后将 CGPath 存储在 ivar 中。你应该在-drawRect: 中画你的CGPath。如果 CGPath 特别复杂(因此很慢),您甚至可能希望将其预渲染为 CGImage,然后再合成 CGImage。
在 iPhone 上可能的情况下,您应该完全避免使用 Core Graphics,而是在 Photoshop 中预渲染图像并将它们保存在您的 Resources 文件夹中。 3G 只是不需要计算能力来跟上复杂的核心图形处理。这与 Apple 最近对 Mac 的建议相反,该建议不鼓励使用预渲染图像并鼓励渐变和路径,并且对于 3GS,由于处理器速度更快,因此它的重要性不那么重要,但它仍然是 iPhone 目前的建议,并且可能会在他们发布更高分辨率的 iPhone 显示器之前。如果您有动态图像,这当然是不可能的,但是对于静态图像,您应该牢记这一点。
编辑:
首先,如果可行,请确保您只绘制那些脏的部分。 -drawRect: 传递给你一个脏矩形。如果特定元素不与该矩形相交,则无需重绘它。同样,您应该使用-setNeedsDisplayInRect: 来指示哪些部分需要更新。如果您可以轻松地将视图分解为不重叠的矩形(或偶尔重叠的矩形),那么这很有效。
如果您的视图由想要独立计算的各种重叠组件组成,那么您可以在CALayer 上绘制每个组件,然后将图层附加到视图(可能在视图上不绘制任何内容)本身)。然后,您可以仅在已更改的图层上调用 -setNeedsDisplay。这就是我可能会使用的垂直线示例。我将创建一个CALayer 线的宽度和视图的高度,将其背景颜色设置为线颜色,并将其附加到所需位置的视图。然后移动线非常快(甚至使用变换旋转它),稍后删除线是微不足道的。如果您想要更高级的线条绘制(抗锯齿等),您当然可以使图层更宽并实际在图层内部绘制线条。如果需要,图层可以与视图一样大。
Core Animation Programming Guide 有大量关于 CALayer 及其使用方法的文档。