Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CGContextStrokePath在iPhone上绘制一些线条和圆圈时性能不佳_Iphone_Performance_Xcode_Graphics - Fatal编程技术网

CGContextStrokePath在iPhone上绘制一些线条和圆圈时性能不佳

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

我需要在我的视图上画几百条线和圆圈,它们通过一个定时器函数不断移动,在这里我调用[myView setNeedsDisplay]来更新视图

我从UIView中创建子类(myView)并实现drawRect函数来执行以下操作

-(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,然后显示出来。这似乎要快得多。”阿比克斯:我不认为这是解决办法,而是实际的解决办法。布拉德不仅仅是在建议一种解决问题的方法,而是在解释说单凭石英是不适合你工作的工具。