Không. Phát hiện va chạm không phải lúc nào cũng là O (N ^ 2).
Chẳng hạn, giả sử chúng ta có một không gian 100x100 với các đối tượng có kích thước 10x10. Chúng ta có thể phân chia không gian này trong các ô của 10x10 bằng một lưới.
Mỗi đối tượng có thể nằm trong tối đa 4 ô lưới (nó có thể nằm vừa trong một khối hoặc nằm giữa các ô). Chúng ta có thể giữ một danh sách các đối tượng trong mỗi ô.
Chúng ta chỉ cần kiểm tra va chạm trong các ô đó. Nếu có số lượng đối tượng tối đa trên mỗi ô lưới (giả sử, không bao giờ có nhiều hơn 4 đối tượng trong cùng một khối), thì phát hiện va chạm cho mỗi đối tượng là O (1) và phát hiện va chạm cho tất cả các đối tượng là O (N).
Đây không phải là cách duy nhất để tránh sự phức tạp của O (N ^ 2). Có các phương pháp khác, đầy đủ hơn cho các trường hợp sử dụng khác - thường sử dụng cấu trúc dữ liệu dựa trên cây.
Thuật toán tôi mô tả là một loại phân vùng không gian , nhưng có các thuật toán phân vùng không gian khác. Xem Các loại cấu trúc dữ liệu phân vùng không gian để biết thêm một số thuật toán tránh sự phức tạp tạm thời O (N ^ 2).
Cả hai cơ chế hỗ trợ Box2D và Bullet để giảm số lượng cặp được kiểm tra.
Từ hướng dẫn , phần 4.15:
Xử lý va chạm trong một bước vật lý có thể được chia thành pha hẹp và pha rộng. Trong pha hẹp, chúng tôi tính toán các điểm tiếp xúc giữa các cặp hình. Hãy tưởng tượng chúng ta có N hình dạng. Sử dụng lực lượng vũ phu, chúng ta sẽ cần thực hiện pha hẹp cho các cặp N * N / 2.
Lớp b2BroadPhase giảm tải này bằng cách sử dụng cây động để quản lý cặp. Điều này làm giảm đáng kể số lượng các cuộc gọi pha hẹp.
Thông thường bạn không tương tác trực tiếp với pha rộng. Thay vào đó, Box2D tạo và quản lý một pha rộng trong nội bộ. Ngoài ra, b2BroadPhase được thiết kế với vòng lặp mô phỏng của Box2D, vì vậy nó có thể không phù hợp cho các trường hợp sử dụng khác.
Từ Bullet Wiki :
Có nhiều loại thuật toán broadphase cải thiện thuật toán O (n ^ 2) ngây thơ, chỉ trả về danh sách đầy đủ các cặp. Các dải tần được tối ưu hóa này đôi khi giới thiệu nhiều cặp không va chạm hơn nhưng điều này được bù đắp bởi thời gian thực hiện thường được cải thiện của chúng. Họ có đặc điểm hiệu suất khác nhau và không có gì vượt trội so với những người khác trong mọi tình huống.
Cây AABB động
Điều này được thực hiện bởi btDbvtBroadphase trong Bullet.
Như tên cho thấy, đây là một cây AABB động . Một tính năng hữu ích của broadphase này là cấu trúc thích ứng linh hoạt với các kích thước của thế giới và nội dung của nó. Nó được tối ưu hóa rất tốt và một broadphase có mục đích chung rất tốt. Nó xử lý các thế giới động nơi có nhiều đối tượng đang chuyển động, và việc thêm và xóa đối tượng nhanh hơn so với SAP.
Quét và tỉa (SAP)
Trong Bullet, đây là phạm vi các lớp của AxisSweep. Đây cũng là một broadphase có mục đích chung tốt, với một hạn chế là nó đòi hỏi một kích thước thế giới cố định, được biết trước. Broadphase này có hiệu suất tốt nhất cho các thế giới động lực điển hình, nơi hầu hết các đối tượng có ít hoặc không có chuyển động. Cả btAxisSweep3 và bt32AxisSweep3 định lượng điểm bắt đầu và điểm kết thúc cho mỗi trục dưới dạng số nguyên thay vì số dấu phẩy động, để cải thiện hiệu suất.
Liên kết sau đây là phần giới thiệu chung về broadphase và cũng là mô tả về thuật toán Sweep and Prune (mặc dù nó gọi là "Sắp xếp và quét"):
http://www.ziggyware.com/readarticle.php?article_id=128
Ngoài ra, hãy xem trang wikipedia:
http://en.wikipedia.org/wiki/Sweep_and_prune