0

我有一个CADisplayLink符合 Chipmunk Physics 的运行,我的性能非常慢。我NSLogCADisplayLink更新时调用的方法中添加了一个,平均每秒调用 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;
4

1 回答 1

0

事实证明,我的故事板上有一个不同的方法,UIViewController它每 0.1 秒触发一次,但没有关闭,再加上物理处理,让事情陷入困境。

于 2013-02-03T09:55:33.280 回答