我的运行速度问题很小。在加载时,我生成一个至少包含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像素宽),或者仅仅是屏幕上可见的部分?我该怎么做才能优化它?

有帮助吗?

解决方案 2

在尝试了很多事情之后(比如将我的巨大的1000点路径划分为更小的10点路径等等),我已经使用简单的顶点数组将所有内容移植到openGL。 我花了大约4个小时来移植所有东西(甚至缩放路径,滚动它等等),现在,我一直得到一个完整的60fps动画,当我只有22fps的平均值,在28岁时使用CoreGraphics中。

其他提示

如果可能的话,每秒60次绘制1,000点或10,000点路径确实会减慢您的应用程序速度。如果路径是静态的,那么你真的应该只看你在UIView中绘制一次,这样它就可以缓存在UIView的图层中,并为周围的图层设置动画。它需要动画,您可以查看新的CAShapeLayer,它可以简单地通过将动画应用到其路径属性来为Bezier路径设置动画。

但是,10,000像素将比iPhone上的最大纹理尺寸(2048 x 2048)更宽,因此在任何标准视图或图层中显示它时都会出现问题,可能需要将其分解为更小的块或使用CATiledLayer将其渲染到屏幕上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top