我有一个小小的跑步速度问题。在加载时,我生成一个至少包含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像素宽),还是只绘制屏幕上可见的部分?我能做些什么来优化它呢?
发布于 2009-08-04 19:42:07
在尝试了很多东西之后(比如将我巨大的1000点路径分成更小的10点路径等等),我已经使用简单的顶点数组将所有的东西都移植到了openGL。我花了大约4个小时来移植所有东西(甚至缩放路径,滚动它,等等)现在,我得到了一个完整的60fps动画,当我使用CoreGraphics时平均只有22fps,峰值是28。
发布于 2009-07-30 12:09:39
如果可能的话,每秒绘制1000点或10000点路径60次真的会减慢应用程序的速度。如果路径是静态的,你真的应该只在你的UIView中绘制一次,这样它就被缓存在UIView的层中,并在周围的层中设置动画。如果需要设置动画,您可以查看新的CAShapeLayer,它提供了只需将动画应用于路径属性即可为Bezier路径设置动画的功能。
但是,10,000像素将比iPhone上的最大纹理大小(2048 X 2048)更宽,因此在任何标准视图或层中显示它都会出现问题,可能需要将其拆分成更小的块或使用CATiledLayer将其渲染到屏幕上。
https://stackoverflow.com/questions/1205345
复制相似问题