繁体   English   中英

- (void)drawRect:(CGRect)rect; 正在耗尽几乎所有的iPhone CPU

[英]-(void) drawRect:(CGRect)rect; is using up nearly all of iPhone CPU

- (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个图像并让它们滚动,我每次刷新CADisplayLink都会更新,并通过调用[self setNeedsDisplay]使绘图区域无效,并且还增加了我的imageScroll变量。


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

它运行,甚至运行顺利。 但它占用了绝对高的CPU时间(80%+)!! 如何将其关闭到手机上的GPU? 有人告诉我关于CALayers但我以前从未处理过他们

将绘图的每个组件绘制成某个(视图或图层)并让它保持缓存绘图。 然后你只需移动或转换每个组件,就像你说的那样,它都是由GPU完成的。

您可以使用单个视图或单个图层执行此操作,但这并不重要(视图一个层,在引擎盖下)。 关键在于,当您真正想要的是移动相同的持久碎片时,不需要从头开始不断地重绘。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM