我的问题是关于iOS开发的。我正在编写一个简单的游戏,以测试底层的Core Graphics函数(上下文,图层等)以及如何将其与实际的简单视图混合使用……我对此进行了解释:
屏幕上有一个简单的精灵,它具有UIImageView
属性的动画效果,因此帧速率非常完美。
之后,我添加了一个无限背景,该背景通过bezier curves
即时生成。为了对此进行动画处理,我使用了CADisplayLink
,在后台调用了"animate"
方法,将我的点移到bezier curve
上,然后调用了setNeedsDisplay
。它可以“或多或少”地很好地工作,但是如果我删除了背景(或调用了setNeedsDisplay
,因此它不会在每一帧都重新生成),则帧速率会增加很多,因此“任何东西”在这一部分都无法正常工作。 。
我还尝试了双缓冲系统,但是它的工作性能比当前代码差。我虽然也打算使用线程,但是我真的发现CPU在后台很难做任何事情。
这是代码:
//This is called automatically with CADDisplayLink.
- (void) animate:(CADisplayLink *)sender
{
//Check for deleting the first point.
float x = points[firstPoint].x;
if ( x < -2*DIST ) {
CGFloat lastX = points[lastPoint].x;
lastPoint = firstPoint;
firstPoint = ((firstPoint + 1) % (TOTAL_POINTS));
points[lastPoint] = CGPointMake(lastX + DIST, [self getNextY]);
}
//Move points
for(int i = 0; i < TOTAL_POINTS; i++) {
points[i].x -= 7;
}
//Mark as "needed to redraw"
[self setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 3.0);
CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0);
CGContextSetRGBFillColor(context, 1.0, 0, 0, 1.0);
CGContextSetLineCap(context, kCGLineCapRound);
//Create path
CGMutablePathRef path = CGPathCreateMutable();
//Draw the curve
[self drawBezierCurveInPath:path];
//Close and add path
CGPathAddLineToPoint(path, NULL, 485, -5);
CGPathAddLineToPoint(path, NULL, -5, -5);
CGPathCloseSubpath(path);
CGContextAddPath(context, path);
CGContextSetFillColorWithColor(context, bg2);
// [[UIColor redColor] setFill];
[[UIColor blackColor] setStroke];
CGContextDrawPath(context, kCGPathFillStroke);
//Release
CGPathRelease(path);
//Paint time.
playintIntervalView.text = [NSString stringWithFormat:@"%f", playingInterval];
}
- (void) drawBezierCurveInPath: (CGMutablePathRef) path
{
CGPoint fp = midPoint(points[firstPoint], points[(firstPoint+1)%TOTAL_POINTS]);
CGPathMoveToPoint(path, NULL, fp.x, fp.y);
int i = firstPoint;
for (int k = 0; k < TOTAL_POINTS-2; k++) {
previousPoint2 = points[i];
previousPoint1 = points[(i+1)%TOTAL_POINTS];
currentPoint = points[(i+2)%TOTAL_POINTS];
// calculate mid point
CGPoint mid2 = midPoint(currentPoint, previousPoint1);
CGPathAddQuadCurveToPoint(path, nil, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
i = (i + 1) % TOTAL_POINTS;
}
}
我希望存储一个
UIBezierPath
(这样我便可以进行一些碰撞测试),但是它不允许您仅删除一个点(当它离开屏幕左侧时),因此我也必须在每一帧初始化它...我想念什么吗? 最佳答案
这可能有点晚了,但是在这种情况下使用CADisplayLink进行动画制作不是一个好主意。
您应该查看CoreAnimation以获取有效的路径动画。
这里的问题是您试图每秒重绘60次,而drawRect中的代码可能没有在毫秒内完成。
通过删除setNeedsDisplay,您基本上是在告诉它不要更新。