0

私のアプリケーションでは、時間をカウントするためにNSTimerを実装しました。スワイプ検出があり、ユーザーが画面をスワイプすると、アニメーションが継続的に実行されます。私の質問は、画面を(左/右に連続して)スワイプするとNSTimerの速度が低下することです。誰かがこの問題を解決する方法を教えてもらえますか?

//コード

    gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/100
                                                          target:self
                                                        selector:@selector(updateGameTimer)
                                                        userInfo:nil
                                                        repeats:YES];

    -(void)updateGameTimer
    {
        counter++;
        tick++;
        if(tick==100){
            tick = 0;
            seconds += 1;
        }
        if(counter==100){
            counter = 0;
        }
        timerLabel.text = [NSString stringWithFormat:@"%i.%02d",seconds,counter];
    } 


//swipe detection

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesMoved:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    //CGPoint curPt = [touch locationInView:self.view];    
    CGPoint newLocation = [touch locationInView:self.view];
    CGPoint oldLocation = [touch previousLocationInView:self.view];
    gameView.multipleTouchEnabled = true;

    if(newLocation.x-oldLocation.x>0){
        swipe_direction = 1;
        //NSLog(@"left");
    }
    else{
        swipe_direction = 2;
        //NSLog(@"right");

    }

    if(swipe_direction==1){
        //animate images
        //play sound effect
    }
    else if(swipe_direction==2){
       //animate images
       //play sound effect
    }

}
4

2 に答える 2

5

NSTimerのドキュメントから...

タイマーはリアルタイムのメカニズムではありません。タイマーが追加された実行ループモードの1つが実行中であり、タイマーの起動時間が経過したかどうかを確認できる場合にのみ起動します。一般的な実行ループが管理するさまざまな入力ソースのため、タイマーの時間間隔の有効な解決は50〜100ミリ秒のオーダーに制限されます。長いコールアウト中、または実行ループがタイマーを監視していないモードのときにタイマーの起動時間が発生した場合、次に実行ループがタイマーをチェックするまで、タイマーは起動しません。したがって、タイマーが実際に起動する時間は、スケジュールされた起動時間の後、かなりの期間になる可能性があります。

タイマーの解像度は10ミリ秒であるため、実行ループが十分に速く完了しない場合(10ミリ秒未満)、リアルタイムとカウンターの間の遅延に気付くようになります。

ゲームを実装している場合、開発者は通常、CPUまたはクロック速度からの関連付けを解除しようとします。

この答えを見てください

または、 cocos2dのようなフレームワークが独自のスケジューラーを実装する方法を見てみましょう。

于 2012-07-23T02:45:22.580 に答える
0

説明から「減速」の意味を理解するのは難しいです。処理負荷のために実際の時計に完全に追いついていないだけですか、それとも実際に一時的に停止していますか?

このような状況では、実際には、タッチイベントの処理やスクロールなどの特定のUIプロセスが発生しているときに、別の実行ループモードになっていることが問題になります。iOSに明示的に指示しない限り、デフォルトのNSTimerインスタンスは実際にはこのモードでは起動されません。

ここでこの他の答えを参照してください

適切な実行ループモードのタイマーのリストにタイマーを追加するのと同じくらい簡単かもしれません。

gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/100
                                             target:self
                                           selector:@selector(updateGameTimer)
                                            serInfo:nil
                                            repeats:YES];

[[NSRunLoop currentRunLoop] addTimer: gameTimer forMode: NSRunLoopCommonModes];

これで問題が解決するかどうかを確認するのは、簡単な1行の変更です。ティックメカニズム全体を再設計するよりもはるかに簡単です。試してみます!

于 2012-07-23T05:04:14.547 に答える