我有一个游戏,我在UIView上绘制4到5个大圆圈,然后旋转它们。这一切都是通过drawLayer:inContext:
方法完成的。
虽然它有效但效率非常低,占用了100%的CPU;占用100%CPU的5个圆圈?!那太离谱了!我必须接近这个错误。
如何在Objective-C中有效地为绘制路径设置动画,以便CPU使用率不会那么高?我只是不应该以这种方式动画?如果是这样,我该如何正确地为必须改变的形状设置动画?
为了让您更多地了解我在这里尝试做什么,屏幕上会显示5个响铃。每个都有一个空隙,用户将试图逃脱。环将不断折叠到屏幕的中心,但线宽和间隙尺寸(沿圆周)将始终相同。
这就是为什么我不只是用CGAffineTransforms做这件事。当环的半径缩小时,环需要不断重新绘制。
以下是我正在使用的代码:
const float ringThickness = 20;
- (id)initWithFrame:(CGRect)frame displayMode:(BOOL)mode
{
self = [super initWithFrame:frame];
if(self)
{
[self setBackgroundColor:[UIColor clearColor]];
playMode = mode;
[self.layer setContentsScale:[UIScreen mainScreen].scale];
rings = [[NSMutableArray alloc] init];
if(mode)
{
//Add rings
for(int i = 0; i < 5; i++)
{
[rings addObject:[@{@"radius" : @(100+ 40 * i + 5*powf(i, 2)), @"gapCenter" : @(randomFloat(0, 2 * M_PI)), @"direction" : @(i % 2)} mutableCopy]];
}
gapSize = 250;
autoplay = [NSTimer scheduledTimerWithTimeInterval:1/60.0 target:self selector:@selector(timer) userInfo:nil repeats:YES];
}
[self.layer setNeedsDisplay];
}
return self;
}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
CGContextSetLineCap(ctx, kCGLineCapButt);
CGContextSetLineWidth(ctx, ringThickness);
CGContextBeginPath(ctx);
for(int i = 0; i < rings.count; i++)
{
NSMutableDictionary* ring = rings[i];
float radius = [ring[@"radius"] floatValue];
float brightness = 120 / radius;
brightness = (brightness > 1) ? 1 : brightness;
if(playMode)
brightness /= 2;
CGContextSetStrokeColorWithColor(ctx, [UIColor colorWithRed:1 green:(153.0/255) blue:(151.0/255) alpha:brightness].CGColor);
float gapCenter = [ring[@"gapCenter"] floatValue];
float cc = 2 * M_PI * radius;
float gapWidth = gapSize / cc * 360;
float gapStart = gapCenter + (gapWidth / 360.0 * M_PI);
CGContextAddArc(ctx, sw()/2, sh()/2, radius, gapStart, gapStart + (2 * M_PI) - (gapWidth / 360.0 * M_PI), 0);
CGContextStrokePath(ctx);
if(playMode)
{
//Autoplay
if([ring[@"direction"] boolValue])
{
ring[@"gapCenter"] = @(gapCenter + 0.005 * M_PI);
}
else
{
ring[@"gapCenter"] = @(gapCenter - 0.005 * M_PI);
}
}
}
}
- (void)timer
{
[self.layer setNeedsDisplay];
}
有人可以引导我朝正确的方向前进吗?这是ObjC的一部分,我仍然不太了解。