CGContext优化
-
05-07-2019 - |
题
我的运行速度问题很小。在加载时,我生成一个至少包含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将其渲染到屏幕上。
不隶属于 StackOverflow