我有一個CADisplayLink
符合Chipmunk物理,我得到非常緩慢的表現。我在CADisplayLink
更新中調用了方法NSLog
,它被稱爲平均每秒22次。我的印象是這應該更接近60.我有frameInterval
設置爲1,所以應該是60fps,在一個完美的世界?德爾塔時間平均約爲0.0167秒(1/60是0.0167,這讓我更加困惑)。應該調用CADisplayLink的displayLink每秒多少次?
我的屏幕邊界四周只有8個圓形的屏幕,每次打電話時更新到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;
你可以在計時器分析器下運行這個工具,看看什麼是時間跨度。 – Metabble
嗯。是的,除非比你想象的要多得多,否則你不應該遇到性能問題。只有分析器會告訴你任何有趣的事情。 – slembcke