应该调用CADisplayLink的displayLink一秒钟多少次?

时间:2013-02-01 16:11:25

标签: objective-c performance quartz-graphics chipmunk cadisplaylink

我有一个CADisplayLink与Chipmunk Physics一致,我的表现非常慢。我在NSLog更新中调用的方法中加了一个CADisplayLink,并且它被称为平均每秒22次。我的印象是它应该接近60.我将frameInterval设置为1,所以它应该是60fps,在一个完美的世界中?增量时间平均约为0.0167秒(而1/60 IS为0.0167,这让我更加困惑)。

我的屏幕边界周围只有四面墙,屏幕上只有八个圆形体,每次调用时更新为UIButton个实例,所以我认为我没有做任何应该做的事情在我的4S和iPad3上对它征税。我在一个单独的方法中每2.5秒对每个按钮施加一次随机力。在模拟器中运行是非常平滑的,因此它只是一个设备问题。任何人都可以帮助我发现造成这里放缓的原因,以及我能做些什么呢?

以下是相关代码,首先是设置链接的代码:

[NSTimer scheduledTimerWithTimeInterval: 2.5f target: self selector: @selector(updateForces) userInfo: nil repeats: YES];
_displayLink = [CADisplayLink displayLinkWithTarget: self selector: @selector(update)];
_displayLink.frameInterval = 1;
[_displayLink addToRunLoop: [NSRunLoop mainRunLoop] forMode: NSRunLoopCommonModes];

这是应该调用的方法(我认为!)每秒60次,但只调用22次左右:

if (!gameIsPaused) {
    cpFloat dt = _displayLink.duration * _displayLink.frameInterval;
    cpSpaceStep([[AGChipmunkSpace sharedInstance] space], dt);

    for (LCBall *i in balls) {
        cpVect pos1 = cpBodyGetPos(i.body);
        CGAffineTransform trans1 = CGAffineTransformMakeTranslation(pos1.x, pos1.y);
        CGAffineTransform rot1 = CGAffineTransformMakeRotation(cpBodyGetAngle(i.body));
        i.button.transform = CGAffineTransformConcat(rot1, trans1);
    }
}

最后,这里是每2.5秒调用一次的方法来应用随机力(updateForces):

if (!gameIsPaused) {
    for (LCBall *i in balls) {
        int randomAngle = arc4random() % 360;
        CGPoint point1 = [self getVectorFromAngle: randomAngle AndMagnitude: (arc4random() % 40) + ((arc4random() % 20) + 15)];
        i.body -> f = cpv(point1.x, point1.y);
    }
}

(另外,这是我从一个角度获取矢量的方法,我怀疑是导致这个问题):

angle = (angle / 180.0) * M_PI;
float x = magnitude * cos(angle);
float y = magnitude * sin(angle);
CGPoint point = CGPointMake(x, y);
return point;

1 个答案:

答案 0 :(得分:0)

事实证明,我的故事板中的另一个UIViewController上有一个方法,每隔0.1秒就会触发一次没有关闭的方法,并结合物理处理,会让事情变得迟钝。