1
- (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]];
}

clippingRegion并给我我想要的圆角矩形(第一个是剪切区域,第二个是我的文本的覆盖textRegionUIBezierPaths

中间部分是绘制 3 个图像并让它们滚动,我从 a 中每 2 次刷新更新一次CADisplayLink,并且通过调用使绘制区域无效[self setNeedsDisplay],并且还增加了我的 imageScroll 变量。


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

它运行,甚至运行平稳。但它消耗了绝对大量的 CPU 时间(80%+)!!我如何将它推到手机上的 GPU 上?有人告诉我 CALayers,但我以前从未处理过它们

4

1 回答 1

4

将绘图的每个组件绘制一次(视图或图层)并让它保存缓存的绘图。然后你只需移动或变换每个组件,正如你所说,这一切都是由 GPU 完成的。

您可以使用单个视图或单个层来执行此操作,但这并不重要(视图一个层,在引擎盖下)。关键是当你真正想要的只是移动相同的持久部分时,没有必要不断地从头开始重新绘制。

学习 CALayer 是个好主意,因为它实际上是 iOS 上所有绘图的基础。还有什么比这更重要的呢?

于 2012-09-27T05:10:20.273 回答