CGContextStrokePath在iPhone上绘制一些线条和圆圈时性能不佳
我需要在我的视图上画几百条线和圆圈,它们通过一个定时器函数不断移动,在这里我调用[myView setNeedsDisplay]来更新视图 我从UIView中创建子类(myView)并实现drawRect函数来执行以下操作CGContextStrokePath在iPhone上绘制一些线条和圆圈时性能不佳,iphone,performance,xcode,graphics,Iphone,Performance,Xcode,Graphics,我需要在我的视图上画几百条线和圆圈,它们通过一个定时器函数不断移动,在这里我调用[myView setNeedsDisplay]来更新视图 我从UIView中创建子类(myView)并实现drawRect函数来执行以下操作 -(void) drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGFloat red[4] = { 1, 0, 0, 1}; CGContext
-(void) drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat red[4] = { 1, 0, 0, 1};
CGContextSetLineWidth(context, 1);
CGContextSetShouldAntialias(context, NO);
CGContextSetLineCap(context, kCGLineCapSquare);
CGContextSetStrokeColor(context, red);
// rects is an array of CGRect of size ~200
for (int i = 0; i < N; i++) {
CGContextAddEllipseInRect(context, rects[i]);
}
// points is an array of CGPoint of size ~100
CGContextAddLines(context, points, N);
CGContextStrokePath(context, color);
}
-(void)drawRect:(CGRect)rect{
CGContextRef context=UIGraphicsGetCurrentContext();
CGFloat red[4]={1,0,0,1};
CGContextSetLineWidth(上下文,1);
CGContextSetShouldAntialias(上下文,否);
CGContextSetLineCap(上下文,kCGLineCapSquare);
CGContextSetStrokeColor(上下文,红色);
//rects是大小约为200的CGRect数组
对于(int i=0;i
但这是一条慢狗。这里有我遗漏的东西吗?
完成一个完整的绘图几乎需要1秒钟通过不断地重画对象来设置对象的动画是一种不好的方法。由于显示系统的工作方式,从用户界面的角度来看,石英绘图是最慢的事情之一 相反,您要做的是为每个要设置动画的元素创建单独的层或视图。这些图层或视图将只绘制一次,然后缓存。当层移动时,它们不会被重新绘制,只是合成。通过这种方式,即使是速度最慢的iOS设备(最初的iPhone、iPhone 3G和第一代iPod touch)也可以以每秒60帧的速度制作多达100层的动画
把它想象成卡通动画。动画师不是手工重画每一帧的每一部分,而是使用单元在帧之间重复使用元素,这些元素保持不变或只是移动而不改变形式。这大大减少了制作卡通的工作量。感谢Brad的快速回复。然而,我这里的问题是,在每次迭代中,我的算法都会返回随机的几何形状,所以很难预先绘制它们,然后移动它们。我相信即使这样也会有办法做到的。但现在我已经找到了一个解决办法,把我所有的东西都放在一个原始内存缓冲区中,然后把它转换成UIImage,然后显示出来。这似乎要快得多。”阿比克斯:我不认为这是解决办法,而是实际的解决办法。布拉德不仅仅是在建议一种解决问题的方法,而是在解释说单凭石英是不适合你工作的工具。