2017-06-13 29 views
1

SwiftでプログラムされたiOSアプリでUIPanGestureRecognizerを使用して、ユーザーが画像の色成分を制御できるようにしています。更新はわずか1秒しかかかりませんが、UIPanGestureRecognizerは1秒間に何十回も呼び出されるので、全体的な見栄えが遅くなります。これが起こらないようにする最良の方法は何ですか?今は3回目の更新のたびに関数を呼び出すようにしていますが、これは単調ではないようです。UIPanGestureRecognizer更新間隔

+0

パンジェスチャーがUIColorを操作するコードを送信できますか? –

答えて

1

私はあなたのジェスチャーに十分に迅速に反応できない場合、彼らがバックログになるという誤った仮定に基づいてあなたの解決策(3回目の更新を考えてみてください)を信じています。しかし、それはどのように動作するのではありません。メインスレッドがジェスチャーに追いつけない場合、ジェスチャーは削除され、バックログにはなりません。実際、あなたの解決策(3回目の更新を考えてみる)は、それを解決するのではなく、遅れを導入するだけです。

だから、目標はタッチをより反応的にすることです。 2つの可能性の問題がここにあります:それは成功したパンとして識別される前

  1. パンジェスチャーは、ジェスチャーが最初に認識される前に、このようにわずかなずれがあることができ、少しの運動が必要です。ジェスチャー認識装置とその前に問題の周りのトリックがありますがあなたの代わりに、など、ジェスチャー認識装置を使用してtouchesBegantouchesMovedを実装していないとき

  2. は、第二の特徴可能があります。ジェスチャーを最初に認識するために遅れを避けるだけでなく、予測的なタッチにも参加することができます。

ので、デバイス上の高パフォーマンスなタッチのために、あなたが何かを行うことができます:

var start: CGPoint? 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    start = touches.first?.location(in: view) 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    guard let touch = touches.first else { return } 

    let point: CGPoint 

    if let predictedTouch = event?.predictedTouches(for: touch)?.last { 
     point = predictedTouch.location(in: view) 
    } else { 
     point = touch.location(in: view) 
    } 

    updateColor(for: point) 
} 

// make sure when you're done to update in `touchesEnded`, too, in case 
// the last `touchesMoved` generated a predictive touch, but when we're 
// done, we really want to use the final real `location` 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    guard let touch = touches.first else { return } 

    updateColor(for: touch.location(in: view)) 
} 

private func updateColor(for point: CGPoint) { 
    // do something with `start` and `point` to adjust the color 
} 

注意を、私の経験では、常にシミュレータで予測タッチを体験するので、確認することはありませんこれを物理的なデバイスでテストすることができます。


第3の潜在的な問題があることを認識する価値があります。具体的には、「カラーコンポーネントの変更」が長すぎて60fpsの画像をレンダリングできない場合は、計測器でプロファイリングを行い、その問題の原因を特定したいと考えています。しかし、問題の再現可能な例(例:MCVE)を見なければコメントできません。

また、スウィフトコードに応じてかなりのパフォーマンスの変更が行われる可能性があるので、ビルドを「リリース」してから、物理的なデバイスでテストしてくださいシミュレータ内にあります。

しかし、物理的なデバイスで予測的なタッチを使用してリリースビルドをテストする場合は、一般にはまともなパフォーマンスを得る必要があります。しかし、いくつかのコードを見ずに言うのは難しいです。

関連する問題