Câu trả lời đúng phụ thuộc một chút vào trò chơi thực tế mà bạn thiết kế và việc chọn một trò chơi khác thực sự sẽ đòi hỏi phải thực hiện cả hai và thực hiện hồ sơ để tìm ra trò chơi nào hiệu quả hơn về không gian hoặc thời gian trên trò chơi cụ thể của bạn.
Phát hiện lưới dường như chỉ áp dụng để phát hiện va chạm giữa các đối tượng chuyển động và nền tĩnh. Ưu điểm lớn nhất của điều này là nền tĩnh được biểu diễn dưới dạng mảng bộ nhớ liền kề và mỗi lần tra cứu va chạm là O (1) với địa phương tốt nếu bạn cần thực hiện nhiều lần đọc (vì các thực thể bao phủ nhiều hơn một ô trong lưới). Nhược điểm, nếu nền tĩnh lớn, là lưới có thể khá lãng phí không gian.
Nếu thay vào đó, bạn biểu thị nền tĩnh là tứ giác, thì chi phí tra cứu riêng lẻ tăng lên, nhưng vì các khối lớn của nền chiếm một lượng không gian nhỏ, nên các yêu cầu bộ nhớ giảm xuống và do đó, nhiều nền có thể nằm trong bộ nhớ cache. ngay cả khi phải mất gấp 10 lần số lần đọc để thực hiện tra cứu theo cấu trúc như vậy, nếu tất cả nằm trong bộ đệm, nó vẫn sẽ nhanh hơn 10 lần so với một lần tra cứu với một lỗi bộ nhớ cache.
Nếu tôi phải đối mặt với sự lựa chọn? Tôi sẽ đi với việc thực hiện lưới, bởi vì nó đơn giản để làm, tốt hơn là dành thời gian của tôi cho các vấn đề khác, thú vị hơn. Nếu tôi nhận thấy rằng trò chơi của tôi chạy chậm một chút, tôi sẽ thực hiện một số hồ sơ và xem những gì có thể sử dụng một số trợ giúp. Nếu có vẻ như trò chơi đang dành nhiều thời gian để phát hiện va chạm, tôi sẽ thử thực hiện một cách khác, như là một phần tư (sau khi hoàn thành tất cả các sửa chữa dễ dàng trước), và tìm hiểu xem điều đó có giúp ích gì không.
Chỉnh sửa: Tôi chưa biết cách phát hiện va chạm lưới liên quan đến việc phát hiện va chạm của nhiều thực thể di động, nhưng thay vào đó, tôi sẽ trả lời cách chỉ số không gian (Quadtree) cải thiện hiệu suất phát hiện so với giải pháp lặp. Giải pháp ngây thơ (và thường hoàn toàn tốt) trông giống như thế này:
foreach actor in actorList:
foreach target in actorList:
if (actor != target) and actor.boundingbox intersects target.boundingbox:
actor.doCollision(target)
Điều này rõ ràng có hiệu suất xung quanh O (n ^ 2), với n số lượng diễn viên hiện đang sống trong trò chơi, bao gồm đạn và tàu vũ trụ và người ngoài hành tinh. Nó cũng có thể bao gồm những trở ngại tĩnh nhỏ.
Điều này hoạt động rất tốt miễn là số lượng các mặt hàng như vậy là khá nhỏ, nhưng bắt đầu trông hơi nghèo khi có hơn vài trăm đối tượng để kiểm tra. 10 đối tượng cho kết quả chỉ trong 100 lần kiểm tra va chạm, 100 kết quả trong 10.000 lần kiểm tra. 1000 kết quả trong một triệu kiểm tra.
Một chỉ số không gian (như tứ giác) có thể liệt kê một cách hiệu quả các vật phẩm mà nó thu thập theo các mối quan hệ hình học. điều này sẽ thay đổi thuật toán va chạm thành một cái gì đó như thế này:
foreach actor in actorList:
foreach target in actorIndex.neighbors(actor.boundingbox):
if (actor != target) and actor.boundingbox intersects target.boundingbox:
actor.doCollision(target)
Hiệu quả của việc này (giả sử phân phối đồng đều các thực thể): thường là O (n ^ 1,5 log (n)), vì chỉ số lấy khoảng so sánh log (n) để so sánh, sẽ có khoảng so sánh sqrt (n) , và có n diễn viên để kiểm tra. Tuy nhiên, trên thực tế, số lượng hàng xóm luôn khá hạn chế, vì nếu xảy ra va chạm, phần lớn thời gian một trong các đối tượng bị xóa hoặc di chuyển khỏi va chạm. do đó bạn chỉ nhận được O (n log (n)). Đối với 10 thực thể, bạn thực hiện (khoảng) 10 so sánh, với 100, bạn làm 200, cho 1000 bạn thực hiện 3000.
Một chỉ mục thực sự thông minh thậm chí có thể kết hợp tìm kiếm hàng xóm với phép lặp số lượng lớn và thực hiện gọi lại trên mỗi thực thể giao nhau. Điều này sẽ cho hiệu suất khoảng O (n), vì chỉ mục được quét một lần thay vì truy vấn n lần.