1

XCode を使用して iOS 用のゲームを作成していますが、1 つの問題が発生しました。

ループを使用すると、ループが終了した後の次のフレームまでグラフィックが更新されません。たとえば、次のようなものがあるとします。

something.center = CGPointMake(20, something.center.y);
while(something.center.x < 50)
{
    something.center = CGPointMake(something.center.x + 1, something.center.y);
    // Just a delay:
    [NSThread sleepForTimeInterval:0.01];
}

UIImageView の「何か」は 20 から 50 にまっすぐ進みます。この場合は NSTimer を使用する必要があることはわかっていますが、単純にするためにこの例を作成しました。

画面を更新するために呼び出すことができる関数、ある種の VBL はありますか?

4

3 に答える 3

3

では、画面を更新するために呼び出すことができる関数、ある種のVBLはありますか?

いいえ、それは描画の仕組みではありません。ループ内でビューを50回変更した場合、実行ループは変更の合間に表示を更新する機会がないため、すべての変更が一度に行われたように見えます。ビューを定期的に無効にし、OSにコードを呼び出して各変更を加える必要があります。

それは難しいことではありませんが、さらに簡単な方法があります。CoreAnimationを使用することです。CAでは、「このビューの中心をn秒かけてスムーズに新しい値に変更する」と言うことができます。アニメーションを開始すると、それを忘れることができます。残りはCAが処理します。

[UIView animateWithDuration:3.0 animations:^{something.center = newCenter}];

somethingの中心がnewCenter3秒以上移動します。あなたははるかに多くのことをすることができます、しかしあなたはそれについてあなた自身で読むことができます。

タイマーを使用する場合は、アニメーションの1つのステップだけを実行して戻る更新ルーチンを作成する必要があります。次に、タイマーが起動するたびに更新ルーチンを呼び出すようにして、ビューが少しだけ移動するようにします。ビューが目的地に到達したら、タイマーを強制終了します。しかし、CAはこれらすべてをあなたに代わって行い、はるかに優れています。

于 2012-08-31T20:39:19.673 に答える
1

このコンテキストではタイマーを使用しないでください。似たようなものを探したところ、aのCADisplayLink方が適切であることがわかりました。を使用するCADisplayLinkと、画面のコンテンツが更新されたときに通知されます。つまり、一定の間隔でメソッドを呼び出す代わりに、経過時間を計算し、それに応じてコンテンツを更新します。このメカニズムを使用して、リニア タイミング以外のタイミング関数を使用してコンテンツ オフセットをアニメートできるUIScrollViewサブクラスを実装しました。表示リンクが起動するたびに、それに応じてコンテンツ オフセットを設定するだけです。集中的にテストされていないため、実装が完全ではない可能性があることに注意してください。ただし、 の使用に関する優れたチュートリアルもありCADisplayLinkます。

于 2012-09-01T07:05:23.763 に答える
0

UIにメインスレッド(前述のH2CO3など)を使用することがベストプラクティスであるため、sleepForTimeInterval(少なくともユーザーにとって)おそらく最も重要な仕事をしているスレッドを詰まらせるため、を使用することはお勧めしません。代わりに、次のようなタイマーを使用できます。

- (void) updatePosition {

    while(something.center.x < 50) {
        something.center = CGPointMake(something.center.x + 1, something.center.y);
    }
}

NSTimer *timer = [NSTimer timerWithTimeInterval:0.05 target:self selector:@selector(updatePosition) userInfo:nil repeats:YES];
[timer fire];

もちろん、コードを微調整していくつかの変更を加える必要がありますが、それがあなたがすべきことの要点です。

于 2012-08-31T20:24:10.453 に答える