在方法drawRect之外绘制CGLayer:更快?

Posted

技术标签:

【中文标题】在方法drawRect之外绘制CGLayer:更快?【英文标题】:Drawing a CGLayer outside the method drawRect: faster? 【发布时间】:2010-01-07 23:07:08 【问题描述】:

我不太确定,我在问什么...

...但是如果在单独的方法中制作图层组合,并将它们也绘制到 drawRect: 方法之外的视图中... ...那么我的应用程序性能会提高吗?

我实际上是一个puzzlePiece:UIView 类的子类,其中拼图被渲染,但是现在使用setNeedsDisplay 调用重绘,因为绘图实现发生在drawRect: 方法中。应用滞后。

如果我摆脱所谓的 drawRect: 方法可以提高性能吗?

想要实现的东西:http://gotoandplay.freeblog.hu/

【问题讨论】:

我看了你的博文;您对视觉细节的关注非常出色,并且是出色 iPhone 应用程序的重要组成部分。 谢谢。我平日是平面设计师,所以我才知道它的重要性。 【参考方案1】:

我认为您在这里要做的是拥有一个覆盖整个游戏区域的非常单一、简单的 UIView。然后将每个图块放在一个 CALayer 中,并将所有 CALayer 附加到 UIView 并移动它们并旋转它们。那么根本不需要 -drawRect: 。您将在图层中完成所有绘图,并且您应该以这种方式获得最佳性能。 CALayer 原理上类似于 UIView,但重量更轻(更快更简单)。 CALayer 基本上是一个只能绘制的视图;它无法处理触摸或事件。它的父视图必须为此做。但这让我们的 CALayer 更快。

【讨论】:

恐怕 CALayer 驱动的旋转会导致我想要避免的锯齿状抗锯齿。也许我应该只在puzzlePiece 视图中使用CALayers。会不会是“业绩增长者”?我的抗锯齿相关帖子:gotoandplay.freeblog.hu/archives/2009/12/08/… 所以 CALayer 是一个 NSObject 子类,我可以从 CALayer 子类化我的puzzlePiece,并获得更好的性能?霍普索。 正确,您仍然可以使用图层旋转。您可以继承或使用委托。从这里开始:developer.apple.com/iphone/library/documentation/cocoa/… 然后我建议使用 CGContextFillPath() 来绘制路径而不是图像(这会造成麻烦),但始终以最容易计算的布局来绘制它。然后使用变换来旋转它。 developer.apple.com/iphone/library/documentation/cocoa/… 顺便说一句,即使您不经常旋转,变换也非常有用。将变换应用到 CGContext(如 CGContextRotateCTM)然后绘制一些简单的东西通常更快,也更容易。考虑一个指向右上角的箭头 (->)。将 CGContext 旋转 45˚ 更容易,然后只需绘制一个指向右侧的箭头。由于您不断更改旋转,我建议使用图层变换而不是更改 CGContext 变换,因为这样您不必重新计算路径。 只有一件事 more :D CGPath 的计算成本很高。如果您将 CALayer 子类化,则计算一次 CGPath(可能在 -init 中)并在每次必须绘制时重用它。所以你可能想要一个像 [TileLayer tileWithCGPath:] 这样的初始化器。这样,您的所有形状都共享相同的代码,并且您只需计算一次路径(在图层的所有者中)。

以上是关于在方法drawRect之外绘制CGLayer:更快?的主要内容,如果未能解决你的问题,请参考以下文章

将屏幕外 CGLayer 传送到当前上下文时出现锯齿状路径

撤消 CGLayer 的重做问题

在 UIView::drawRect() 之外绘制 UIBezierPath?

如何使用 CgLayer 进行最佳绘图

如何提高CGLayer的绘图质量

无法在 UITableViewCell 的 drawRect 中绘制