有关优化-drawRect:方法的建议

时间:2013-03-24 08:02:06

标签: objective-c core-graphics drawrect cgcontext

我想绘制31个不同笔画宽度的圆圈。在我看来,我无法重复使用它,因为我无法扩展它,所有圈子都有不同的选择。这些视图不是静态的,当我按下视图控制器时,我总是需要重绘它。

更新部分:

当我转换到包含31个圈子的视图时,以下是我在{strong> CircleView.m 中drawRect:方法的时间分析器截图:

Time Profiler screenshot: transition to view with 31 circles without any optimization enter image description here

按照计划,用户会大量交换视图,每次等待重绘都会很烦人 我有几个自定义容器视图。另外~30%的时间从故事板转到loadingView。不过,这对我来说似乎很奇怪,因为现在其他TimeWasteView只有一个subView:DatePickerView,但是根据TProfile的运行时间是84ms而100%花在了[super loadView]方法上。

MY NAIVE(?)尝试优化:

我尝试先将此视图加载一次,将其存储在parentViewController“combinedViewController”中并一直重复使用。我在 CircleView.h

中添加了属性
@property (strong,nonatomic) UIImage *imageCircle;

然后我通过添加调用-createImage方法改变了一点 CircleView.m

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.imageCircle=[self createImage];
    }
    return self;
}

-(UIImage*)createImage
{
    CGSize size=self.frame.size;

    UIGraphicsBeginImageContextWithOptions(size, NO, 1.0);

    CGContextRef contextRef = UIGraphicsGetCurrentContext();

    self.brush=0.6;

    CGRect frameOfCircle=CGRectMake(self.brush/2,self.brush/2, self.frame.size.width-self.brush-1.0f, self.frame.size.height-self.brush);
    // Draw a circle (border only)
    CGContextSetLineWidth(contextRef, self.brush);
    CGFloat mainColor[4]={23.0f/255.0f, 12.0f/255.0f, 0.0f, 0.5};
    CGContextSetStrokeColor(contextRef, mainColor);
    CGContextStrokeEllipseInRect(contextRef, frameOfCircle);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;

}

combinedViewController.m:
这是我尝试从可见区域初始化前10个圆圈:

-(void)createCircles

    {
        self.arrayOfCircles=[[NSMutableArray alloc]init];
        for (int i=0; i<10; i++)
        {
            [self.arrayOfCircles addObject:[self circleViewWithRadius:530+i*35 withBrush:5+i tag:1014+i alphaParam:0.60]];
        }

    }

我想在 CirclesViewController.m中添加子视图:

-(void)addCircles

    {
        CombinedViewController *parentVC=(CombinedViewController*)[self parentViewController];
        for (int i=0; i<10; i++)
        {

            CircleView *circle=(CircleView*)[parentVC.arrayOfCircles objectAtIndex:i];
            UIImageView *imgv=[[UIImageView alloc]initWithImage:circle.imageCircle];
            imgv.center=CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2);
            [self.view insertSubview:imgv belowView:someView];
        }


    }

-(void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];  
   [self addCircles];
}

a)不幸的是,如果我尝试第二种方式,则会添加没有圈子。我用断点调试并且arrayOfCircles不是nil,circle的image属性也不是nil。但是,我认为仍然没有圈子。我的代码中有错误吗?

b)通过提前从CGContext获取图像来优化性能是正确方式吗?如果不是,我恳请你忽略我的'a'问题,并提出一些如何正确获得高绩效的提示 非常感谢!

UPDATE2: 链接:
    http://i.stack.imgur.com/EstBG.png
    http://i.stack.imgur.com/uAjSJ.png
    http://i.stack.imgur.com/Kw0cz.png

0 个答案:

没有答案