1

ビューをドラッグできるビュー階層を考えると、ドラッグされたビューと他のビューの間の衝突を検出するための最も効率的な方法は何ですか?

これは、(擬似コードでの)ブルートフォースアプローチになります。

- (void) onDrag 
{
    CGRect absoluteDraggedViewRect; // Calculate
    for (UIView *otherView in hierarchy)
    {
        CGRect absoluteOtherViewRect; // Calculate
        if (CGRectIntersectsRect(absoluteDraggedViewRect, absoluteOtherViewRect))
        {
            // Collision!
        }
    }
}

上記のコードをどのように改善しますか?

4

1 に答える 1

2

この時点で「目に見える」唯一の改善は、以下を追加することだと思います。

if (otherView == self)
    continue;

あなたのループで。もちろん、selfにある場合のみhierarchy

最後に、ドラッグしたビューと交差するかどうかをすべてのビューで確認する必要があります。後でこれが重大なパフォーマンスの問題であることが判明した場合は、ワークロードの分散を試みることができます。「移動領域」を複数のセクションに分割することができます。ビューをドラッグした後、ビューが交差するセクションを計算し、各セクションのすべてのビューを含む辞書または別の適切なデータ構造を保存します。次に、ドラッグしたビューのセクションのビューをループするだけで済みます。しかし、それが報われるかどうかは、特定のユースケースによって異なります。そして、あなたの現在の方法がパフォーマンスの問題であることが判明した場合にのみ、私はそれを検討します。

ドナルド・クヌースがかつて言ったように:

「私たちは小さな効率を忘れるべきです。たとえば、97%の確率で:時期尚早の最適化はすべての悪の根源です」

于 2012-11-03T18:37:13.363 に答える