Chipmunk Physics に沿ってCADisplayLink
実行していますが、パフォーマンスが非常に低下しています。NSLog
更新時に呼び出されるメソッドに を入れたCADisplayLink
ところ、1 秒あたり平均 22 回呼び出されています。私はそれが 60 に近いはずだという印象を受けました。私はframeInterval
セットを 1 にしているので、完璧な世界では 60 fps である必要がありますか? デルタ時間は平均で約 0.0167 秒です (そして 1/60 IS 0.0167 で、さらに混乱しています)。
画面の境界の周りに 4 つの壁があり、画面上に 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;