TL; DR; Vấn đề của bạn không phải là với việc thực hiện chức năng khoảng cách. Vấn đề của bạn là thực hiện chức năng khoảng cách rất nhiều lần. Nói cách khác, bạn cần tối ưu hóa thuật toán hơn là toán học.
[EDIT] Tôi đang xóa phần đầu tiên trong câu trả lời của mình, vì mọi người ghét nó. Tiêu đề câu hỏi đã yêu cầu các chức năng khoảng cách thay thế trước khi chỉnh sửa.
Bạn đang sử dụng hàm khoảng cách nơi bạn đang tính căn bậc hai mọi lúc. Tuy nhiên, bạn chỉ có thể thay thế mà không cần sử dụng căn bậc hai và tính khoảng cách bình phương thay thế. Điều này sẽ giúp bạn tiết kiệm rất nhiều chu kỳ quý giá.
Khoảng cách ^ 2 = x * x + y * y;
Đây thực sự là một mẹo phổ biến. Nhưng bạn cần điều chỉnh tính toán của mình cho phù hợp. Nó cũng có thể được sử dụng như kiểm tra ban đầu trước khi tính khoảng cách thực tế.
Vì vậy, ví dụ thay vì tính khoảng cách thực tế giữa hai điểm / hình cầu cho một bài kiểm tra giao nhau, chúng ta có thể tính Khoảng cách bình phương thay thế và so sánh với bán kính bình phương thay vì bán kính.
Chỉnh sửa, ngay sau khi @ Byte56 chỉ ra rằng tôi đã không đọc câu hỏi và bạn đã biết về tối ưu hóa khoảng cách bình phương.
Thật không may, trong trường hợp của bạn, thật không may, chúng ta đang ở trong đồ họa máy tính gần như chỉ giao dịch với Không gian Euclide và khoảng cách được xác định chính xác như Sqrt of Vector dot itself
trong không gian euclide.
Bình phương khoảng cách là xấp xỉ tốt nhất bạn sẽ nhận được (về hiệu suất), tôi không thể thấy bất cứ điều gì đánh bại 2 phép nhân, một phép cộng và phép gán.
Vì vậy, bạn nói rằng tôi không thể tối ưu hóa chức năng khoảng cách, tôi nên làm gì?
Vấn đề của bạn không phải là với việc thực hiện chức năng khoảng cách. Vấn đề của bạn là thực hiện chức năng khoảng cách rất nhiều lần. Nói cách khác, bạn cần tối ưu hóa thuật toán hơn là toán học.
Vấn đề là, thay vì kiểm tra giao điểm của người chơi với từng đối tượng trong cảnh, từng khung. Bạn có thể dễ dàng sử dụng sự kết hợp không gian với lợi thế của mình và chỉ kiểm tra các đối tượng ở gần người chơi (có khả năng cao nhất là đánh / giao nhau.
Điều này có thể dễ dàng thực hiện bằng cách thực sự lưu trữ những thông tin không gian đó trong cấu trúc dữ liệu phân vùng không gian . Đối với một trò chơi đơn giản, tôi sẽ đề xuất một Lưới vì về cơ bản nó dễ thực hiện và phù hợp với cảnh động độc đáo.
Mỗi ô / hộp chứa một danh sách các đối tượng mà hộp giới hạn của lưới kèm theo. Và thật dễ dàng để theo dõi vị trí người chơi trong các ô đó. Và để tính toán khoảng cách, bạn chỉ kiểm tra khoảng cách người chơi với các đối tượng bên trong cùng một ô hoặc hàng xóm thay vì mọi thứ trong cảnh.
Một cách tiếp cận phức tạp hơn là sử dụng BSP hoặc Octrees.