CGContext上优化(CGContext Optimization)

2019-09-21 10:13发布

我有一个小运行速度的问题。 上的负载,我产生包含至少1000点的CGMutablePath。 我想在屏幕上滚动这条道路,所以我用这样的代码:

-(void) drawRect:(CGRect)rect {

    /*
    Here, I have a timer calling drawRect 60 times per second.
    There's also code for the scale and currentTime, based on
    an MP3 playback (AVAudioPlayer);
    */

    CGContextRef ref = UIGraphicsGetCurrentContext();   
    CGContextClearRect(ref, [self frame]);

    CGContextSaveGState(ref);
    CGContextTranslateCTM(ref, s.width/2+currentTime, 1);
    CGContextScaleCTM(ref, scale, 1);
    CGContextAddPath(ref, myGraphPath);
    CGContextSetRGBFillColor(ref, .1, .1, .1, .8);
    CGContextFillPath(ref);
    CGContextRestoreGState(ref);
}

问题是,这是一个有点慢,不是很多,但我需要补充的图形代码一大堆更多...我在想,如果设备被绘制整个路径(一旦应用规模,路径约10.000像素宽),或只是部分在屏幕上看到? 我能做些什么来优化呢?

Answer 1:

绘制1000点或者10​​000点路径每秒60次是真的要减慢你申请下来,如果有可能的。 如果路径是静态的,你真的应该看看只绘制它你的UIView内一次,所以它了UIView的层内缓存,并围绕动画层。 它需要将其动画,你可以看看新CAShapeLayer,它提供了简单的通过将动画path属性动画贝塞尔路径的能力。

然而,万个像素会比在iPhone(2048×2048)最大纹理尺寸更宽,所以你必须显示在任何标准视图或层,可能需要或者分解成更小的块或使用CATiledLayer问题它呈现在屏幕上。



Answer 2:

在尝试了很多东西(如将我的巨大的1000点路径成更小的10条路径等)之后,我的一切移植到OpenGL中,使用简单的顶点数组。 我花了大约4个小时到港的一切(甚至缩放路径,滚动它,等...),现在,我得到一个完整的60fps动画的时候,当我在使用时只在28 22fps的平均与峰值CoreGraphics中。



文章来源: CGContext Optimization