Gần đây tôi đang làm việc trên một game bắn súng 2d có nhịp độ nhanh và tôi đã gặp một vấn đề rất lớn. Phát hiện va chạm. Chắc chắn, nó đang làm việc, nhưng nó rất chậm. Mục tiêu của tôi là: Có rất nhiều kẻ thù trên màn hình và khiến chúng không chạm vào nhau. Tất cả kẻ thù đang đuổi theo thực thể người chơi. Hầu hết chúng đều có cùng tốc độ nên sớm muộn gì chúng cũng chiếm cùng một không gian trong khi đuổi theo người chơi. Điều này thực sự làm giảm yếu tố vui nhộn vì, đối với người chơi, có vẻ như bạn chỉ bị truy đuổi bởi một kẻ thù. Để ngăn chúng lấy cùng một không gian, tôi đã thêm một phát hiện va chạm (phát hiện 2D rất cơ bản, phương pháp duy nhất tôi biết) đó là.
Enemy class update method
Loop through all enemies (continue; if the loop points at this object)
If enemy object intersects with this object
Push enemy object away from this enemy object
Điều này hoạt động tốt. Miễn là tôi chỉ có <200 thực thể kẻ thù. Khi tôi đến gần hơn 300-350 thực thể kẻ thù, tốc độ khung hình của tôi bắt đầu giảm mạnh. Đầu tiên tôi nghĩ đó là kết xuất xấu nên tôi đã gỡ bỏ cuộc gọi rút thăm của họ. Điều này chẳng giúp ích gì cả nên dĩ nhiên tôi nhận ra đó là phương pháp cập nhật. Phần nặng duy nhất trong phương pháp cập nhật của họ là phần từng kẻ thù-vòng lặp xuyên qua mọi kẻ thù. Khi tôi đến gần hơn 300 kẻ thù, trò chơi sẽ thực hiện bước lặp 90000 (300x300). Của tôi
Tôi chắc chắn phải có một cách khác để vượt qua sự phát hiện va chạm này. Mặc dù tôi không biết làm thế nào. Các trang tôi tìm thấy là về cách thực sự va chạm giữa hai đối tượng hoặc cách kiểm tra va chạm giữa một đối tượng và ô. Tôi đã biết hai điều đó.
tl; dr? Làm cách nào để tôi phát hiện va chạm giữa RẤT NHIỀU thực thể?
Chỉnh sửa nhanh: Nếu có bất kỳ trợ giúp nào, tôi đang sử dụng C # XNA.