0

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;
4

1 に答える 1

0

ストーリーボードに別の方法があり、UIViewController0.1秒ごとに起動し、オフになっておらず、物理処理と組み合わされて、物事が滞っていたことがわかりました。

于 2013-02-03T09:55:33.280 に答える