我有一个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;