0

ディスパッチャ ソース タイマーを使用して、異なるフレーム レートでビューを更新しています。(8、12、または 24 FPS)

これは、dispatcherTimer を初期化するコードと、タイマーの作成に使用される関数です。
(この関数は、「タイマーの作成」サブセクションの Apple ドキュメントから直接取得されます: http://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html )

電話:

    self.dispatchTimer = [self createDispatchTimerWithInterval:self.project.frameDuration * NSEC_PER_SEC
                                                    leeway:0.0 * NSEC_PER_SEC
                                                     queue:dispatch_get_main_queue()
                                                     block:displayFrame];

関数:

- (dispatch_source_t)createDispatchTimerWithInterval:(uint64_t)interval leeway:(uint64_t)leeway queue:(dispatch_queue_t)queue block:(dispatch_block_t)block {
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,
                                                 0, 0, queue);
    if (timer) {
        dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway);
        dispatch_source_set_event_handler(timer, block);
        dispatch_resume(timer);
    }
    return timer;
}

ビューは完全に更新されますが、タッチ イベントがキャッチされません。私の最初の賭けは、frameDuration を 0.5 秒程度に減らすと、タッチ イベントがキャッチされるため、ブロック「displayFrame」の処理時間がかかりすぎることです。

これは、iPad 2 を搭載した iOS 4 でのみテストしました。

どんな助けやヒントも大歓迎です!

エティエンヌ

アップデート

Apple 開発者フォーラムで同様の質問をしました。ここに回答があります: https://devforums.apple.com/thread/156633?tstart=0

4

1 に答える 1

1

メイン実行ループは、実行ループを通過するたびにメイン キューを空にします。期間が短すぎると言うのは正しいと思います。ソースが新しいブロックをキューに追加する速度が、それらが排出されるよりも速い場合、ランループがイベントの処理を再開しないことは確かです (常にキューを排出しようとしているため)。

于 2012-06-26T20:43:46.690 に答える