Iphone drawRect函数妨碍性能

Iphone drawRect函数妨碍性能,iphone,objective-c,cocoa-touch,drawing,Iphone,Objective C,Cocoa Touch,Drawing,我正在使用DrawRect绘制一条使用CADisplayLink移动的蛇 问题是当蛇很小的时候,速度很好,但是当蛇长得很长的时候,蛇变得非常慢 我使用以下变量跟踪蛇: -用于跟踪蛇头的变量 -用于跟踪蛇尾的变量 -用于跟踪蛇头方向的变量 -用于跟踪蛇尾方向的变量 -包含蛇弯曲的所有点的数组 -阵列以跟踪每个弯板的方向 下面是我用来画蛇的代码 -(void)drawRect:(CGRect)rect{ CGContextBeginPath(上下文); CGContextSetLineWidth(

我正在使用DrawRect绘制一条使用CADisplayLink移动的蛇

问题是当蛇很小的时候,速度很好,但是当蛇长得很长的时候,蛇变得非常慢

我使用以下变量跟踪蛇:
-用于跟踪蛇头的变量
-用于跟踪蛇尾的变量
-用于跟踪蛇头方向的变量
-用于跟踪蛇尾方向的变量
-包含蛇弯曲的所有点的数组
-阵列以跟踪每个弯板的方向

下面是我用来画蛇的代码


-(void)drawRect:(CGRect)rect{
CGContextBeginPath(上下文);
CGContextSetLineWidth(上下文,10.0);
浮动宽度=10.0;
浮点颜色值[]={0.4,0.4,0.4,1.0};
CGColorSpaceRef colorspace=CGColorSpaceCreateDeviceRGB();
CGColorRef-glowColor=CGColorCreate(颜色空间,颜色值);
CGContextSetShadowWithColor(上下文,CGSizeMake(0.0,0.0),glowWidth,glowColor);
CGContextSetLineCap(上下文,kCGLineCapRound);
CGContextSetStrokeColorWithColor(上下文[UIColor blackColor].CGColor);
GContextMoveToPoint(上下文,snake.tail_x,snake.tail_y);
对于(int i=0;i<[snake.bends count];i++{
NSData*bend_dir_value=[snake.bend_direction objectAtIndex:i];
方向弯曲方向=*(方向*)[弯曲方向值字节];
NSData*bend_值=[snake.bends objectAtIndex:i];
CGPoint bend_point=*(CGPoint*)[bend_值字节];
如果(bend|u dir==kEastIn|bend|u dir==kWestIn|bend|u dir==kNorthIn|bend|dir==kSouthIn){
CGContextMoveToPoint(上下文、折弯点.x、折弯点.y);
}
否则{
CGContextAddLineToPoint(上下文、折弯点.x、折弯点.y);
}
}
CGContextAddLineToPoint(上下文,snake.head\u x,snake.head\u y);
}

当蛇的长度/弯曲度增加时,为什么我的表现如此糟糕


我还有别的办法画蛇吗?

可能是你没有关闭你的路径吗?最后,您可能需要:


CGContextClosePath(上下文)

你有没有分析过你的应用程序,以确定当它变慢时,大部分时间都花在哪里


它可能在核心图形的路径笔划中,在您的计算方法中,或者在其他地方。如果您在获得任何配置文件/性能数据之前就开始优化,您可能会在错误的位置花费时间。

在复制粘贴时,我实际上错过了一行。但是我在函数中最后一行代码后面有CGContextSetStrokePath(上下文)。CGContextSetStrokePath是否也关闭路径?还是也添加了这个?从哪里获得CGContextSetStrokePath()?我在开发人员文档中找不到。很抱歉,这是一个打字错误:CGContextStrokePath()是我所拥有的。谢谢你的建议。我还没有分析我的应用程序。仪器是收集此类数据的最佳工具吗?

-(void)drawRect:(CGRect)rect{
CGContextBeginPath(context);
CGContextSetLineWidth(context, 10.0);
float glowWidth = 10.0;
float colorValues[] = {0.4,0.4,0.4,1.0};
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGColorRef glowColor = CGColorCreate(colorspace, colorValues);
CGContextSetShadowWithColor(context, CGSizeMake(0.0, 0.0), glowWidth, glowColor);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetStrokeColorWithColor(context,[UIColor blackColor].CGColor);
GContextMoveToPoint(context, snake.tail_x,snake.tail_y);
for (int i = 0; i < [snake.bends count]; i++) {
NSData *bend_dir_value = [snake.bend_direction objectAtIndex:i];
Direction bend_dir = * (Direction *)[bend_dir_value bytes];
NSData *bend_value = [snake.bends objectAtIndex:i];
CGPoint bend_point = * (CGPoint * )[bend_value bytes];
if (bend_dir == kEastIn || bend_dir == kWestIn || bend_dir == kNorthIn || bend_dir == kSouthIn) {
CGContextMoveToPoint(context, bend_point.x, bend_point.y);
}
else {
CGContextAddLineToPoint(context, bend_point.x, bend_point.y);
}
}
CGContextAddLineToPoint(context, snake.head_x, snake.head_y);
}