【问题标题】:-(void) drawRect:(CGRect)rect; is using up nearly all of iPhone CPU-(无效)drawRect:(CGRect)rect;几乎耗尽了所有 iPhone CPU
【发布时间】:2012-09-27 04:56:33
【问题描述】:
- (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 中每 2 次刷新更新一次,这会通过调用 [self setNeedsDisplay] 使绘制区域无效,并增加我的 imageScroll 变量。


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

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

【问题讨论】:

    标签: objective-c ios core-animation core-graphics


    【解决方案1】:

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

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

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

    【讨论】:

    • 我今天会尝试实现这个!我不知道 CALayers 的行为就像它已经在 GPU 空间中绘制一样,并认为这是徒劳的,因为我需要每帧刷新所有内容......但是谢谢!
    • 不仅是 CALayers,还有 UIViews,因为 UIView CALayer(或 CALayer 的集合)。视图不包含自己的绘图;它们只是层的可触摸包装。 iOS 绘图系统的全部要点——事实上,天才之处在于,一旦你绘制到一个视图(即层)中,绘图就会被缓存并且永远不会重绘,除非明确告知这样做。移动现有绘图、拉伸、变换、更改不透明度等成本低廉。
    • 另外,如果你正在制作动画,为什么不使用 UIView 动画或 CAAnimation?它们也很便宜。你不应该重绘每一帧,你自己。或者,如果您正在使用精灵编写游戏,请使用 OpenGL。
    • @RyanCopley:对于这两个填充,您会发现 CAShapeLayer 相关。 developer.apple.com/library/ios/documentation/GraphicsImaging/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多