使用 CoreGraphics 循环绘制会产生性能问题

Posted

技术标签:

【中文标题】使用 CoreGraphics 循环绘制会产生性能问题【英文标题】:Use of CoreGraphics Loop Draw Creating Performance Issues 【发布时间】:2013-03-19 19:00:50 【问题描述】:

我有兴趣在子类 UIView 中覆盖 drawRect 以为 tableView 创建简单的纹理背景。我已经完成了我的目标,但表现并不那么出色。我知道这对于像我这样的新手来说是一个普遍的问题。然而,由于这是我第一次接触 CoreGraphics,我无法诊断问题的根源。

通过性能影响,我的意思是在 tableViewController 通过导航控制器动画之前存在滞后。如果你愿意,它会挂起。第一次启动我的任何 UITableViewController 时都会出现性能下降,并使用 [[self tableView] setBackgroundView:level1View]; 的适当设置。表视图的后续渲染对性能的影响为 0。当我没有将 backgroundView 属性设置为我的自定义绘制视图时,性能问题就会消失。任何想法都非常感谢。

几个警告:我宁愿不为此平铺图像,除非它是这样做的唯一有效方式。 (尝试学习什么不。)另外,我的代码基于这里找到的教程:http://www.raywenderlich.com/2167/core-graphics-101-patterns

#import "HordLevel1View.h"

static inline double radians (double degrees)  return degrees * M_PI/180; 
void MyDrawColoredPattern1 (void *info, CGContextRef context)


UIColor * dotColor = [UIColor colorWithHue:0 saturation:0 brightness:0.90 alpha:1.0];
UIColor * shadowColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.2];

CGContextSetFillColorWithColor(context, dotColor.CGColor);
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), .25, shadowColor.CGColor);

//First line of circles
CGContextAddArc(context, 1, 1, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 3, 2, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 5, 0, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 5, 3, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 1, 4, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 3, 5, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 5, 6, 1, 0, radians(360), 0);
CGContextFillPath(context);




@implementation HordLevel1View

- (id)initWithFrame:(CGRect)frame

self = [super initWithFrame:frame];
if (self) 
    // Initialization code

return self;


- (void)drawRect:(CGRect)rect

CGContextRef context = UIGraphicsGetCurrentContext();

UIColor * bgColor = [UIColor colorWithHue:0 saturation:0 brightness:0.85 alpha:1.0];
CGContextSetFillColorWithColor(context, bgColor.CGColor);
CGContextFillRect(context, rect);

static const CGPatternCallbacks callbacks =  0, &MyDrawColoredPattern1, NULL ;

CGContextSaveGState(context);
CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL);
CGContextSetFillColorSpace(context, patternSpace);
CGColorSpaceRelease(patternSpace);

CGPatternRef pattern = CGPatternCreate(NULL,
                                       rect,
                                       CGAffineTransformIdentity,
                                       6,
                                       6,
                                       kCGPatternTilingConstantSpacing,
                                       true,
                                       &callbacks);
CGFloat alpha = 1.0;
CGContextSetFillPattern(context, pattern, &alpha);
CGPatternRelease(pattern);
CGContextFillRect(context, self.bounds);
CGContextRestoreGState(context);



@end 

【问题讨论】:

【参考方案1】:

抱歉没有人解决这个问题,希望我的回复仍然有用!我敢肯定,自 3 月以来,您已经取得了长足的进步。

我的第一个想法是图像不仅是一种快速的方式,而且它的代码更简单,也更灵活。但是假设您需要动态绘制,因为内容会根据用户输入而发生根本性变化(我认为这不太可能:])。

在这种情况下,还有一些想法:

创建一次模式,不是每次 drawRect 调用一次,也不是每个单元格视图一次。 更好的是,使用您的模式创建一个 UIImage,并在您的单元格中使用它 为模式使用正确的边界(我认为您正在制作一个与整个视图大小相同的模式)

【讨论】:

以上是关于使用 CoreGraphics 循环绘制会产生性能问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 CoreGraphics 绘制代码很慢?

使用 CoreGraphics 在 iPhone 上绘制简单的线条

使用 CoreGraphics 绘制自定义 UIView

使用CoreGraphics绘制圆形矩形

在 Swift 中使用 CoreGraphics 在屏幕上绘制像素

如何使用quartz2d/coregraphics绘制圆角三角形