Iphone CGC上下文优化
我的跑步速度有点问题。在加载时,我生成一个至少包含1000个点的CGMutablePath。我想在屏幕上滚动此路径,因此我使用以下代码:Iphone CGC上下文优化,iphone,objective-c,quartz-graphics,Iphone,Objective C,Quartz Graphics,我的跑步速度有点问题。在加载时,我生成一个至少包含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 playb
-(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像素宽),还是仅绘制屏幕上可见的部分?我可以做些什么来优化它呢?如果可能的话,每秒绘制1000点或10000点路径60次确实会降低应用程序的速度。如果路径是静态的,那么实际上应该只在UIView中绘制一次,以便将其缓存在UIView的层中,并对周围的层设置动画。如果需要设置动画,您可以查看新的CAShapeLayer,它提供了只需将动画应用于其路径属性即可设置Bezier路径动画的功能
但是,10000像素将比iPhone上的最大纹理大小(2048 x 2048)更宽,因此在任何标准视图或层中显示时都会遇到问题,可能需要将其分解成更小的块,或者使用CATiledLayer将其渲染到屏幕上。尝试了很多操作后(比如将我的1000点大路径划分为更小的10点路径等等),我已经使用简单的顶点数组将所有内容移植到openGL。
我花了大约4个小时来移植所有东西(甚至缩放路径、滚动路径等等)现在,我一直得到一个完整的60fps动画,当我使用CoreGraphics时,平均只有22fps,峰值为28。路径的点坐标是静态的,但我需要根据比例因子沿x轴滚动路径。如果我在生成后立即在层上绘制形状,然后进行缩放,我会有很多模糊(顺便说一下,最大比例因子约为1000)。如果我在绘制到图层之前缩放路径,我只能绘制s.width值的像素。创建这样大小的图层不会给我带来很多改进:/我要检查CAShapeLayer,我还没有听说过它。我的最后一个赌注是尝试使用openGL,但有这么多多边形,我不确定它是否真的有用。我很高兴你找到了它,但是值得注意的是,你可以用CG做很多事情来优化它,使其工作得同样好,甚至可能更好。