- (void)drawRect:(CGRect)rect{

    float sliceSize = rect.size.width / imagesShownAtOnce;
    //Apply our clipping region and fill it with black
    [clippingRegion addClip];
    [clippingRegion fill];

    //Draw the 3 images (+1 for inbetween), with our scroll amount.
    CGPoint loc;
    for (int i=0;i<imagesShownAtOnce+1;i++){
        loc = CGPointMake(rect.origin.x+(i*sliceSize)-imageScroll, rect.origin.y);
        [[buttonImages objectAtIndex:i] drawAtPoint:loc];
    }

    //Draw the text region background
    [[UIColor blackColor] setFill];
    [textRegion fillWithBlendMode:kCGBlendModeNormal alpha:0.4f];

     //Draw the actual text.
    CGRect textRectangle = CGRectMake(rect.origin.x+16,rect.origin.y+rect.size.height*4/5.6,rect.size.width/1.5,rect.size.height/3);
    [[UIColor whiteColor] setFill];
    [buttonText drawInRect:textRectangle withFont:[UIFont fontWithName:@"Avenir-HeavyOblique" size:22]];
}
clippingRegiontextRegionUIBezierPaths,可以为我提供想要的圆角矩形(第一个为剪切区域,第二个为文本覆盖)

中间部分绘制了3张图像,并使其滚动,每更新2张图像都会从CADisplayLink刷新一次,并通过调用[self setNeedsDisplay]并增加我的imageScroll变量来使绘制区域无效。

现在已经完成了背景信息,这是我的问题:

它可以运行,甚至可以平稳运行。但是它消耗了绝对大量的CPU时间(超过80%)!如何将其推送到手机上的GPU?有人告诉我有关CALayers的信息,但我从未与他们打过交道

最佳答案

将图形的每个组件一次绘制到某个对象(一个视图或图层)中,并让其保存缓存的图形。然后,您只需移动或变换每个组件,就如您所说的那样,它们全部由GPU完成。

您可以使用单独的视图或单独的层来执行此操作,但这并不重要(一个视图是一个位于底层的层)。关键是,当您真正想要的只是移动相同的持久性片段时,无需从头开始不断重绘。

了解CALayer将是一个好主意,因为实际上这是所有iOS绘图的基础。有什么比这更重要的事情了?

10-08 05:28