我有一个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;
答案 0 :(得分:0)
事实证明,我的故事板中的另一个UIViewController
上有一个方法,每隔0.1秒就会触发一次没有关闭的方法,并结合物理处理,会让事情变得迟钝。