Một chút nền tảng, tôi đang mã hóa một trò chơi tiến hóa với một người bạn trong C ++, sử dụng ENTT cho hệ thống thực thể. Các sinh vật đi bộ xung quanh trong bản đồ 2D, ăn rau xanh hoặc các sinh vật khác, sinh sản và các đặc điểm của chúng đột biến.
Ngoài ra, hiệu suất vẫn ổn (60fps không có vấn đề gì) khi trò chơi được chạy trong thời gian thực, nhưng tôi muốn có thể tăng tốc đáng kể để không phải chờ 4h để xem bất kỳ thay đổi đáng kể nào. Vì vậy, tôi muốn có được nó càng nhanh càng tốt.
Tôi đang vật lộn để tìm một phương pháp hiệu quả cho các sinh vật tìm thức ăn của chúng. Mỗi sinh vật được cho là tìm kiếm thức ăn tốt nhất đủ gần với chúng.
Nếu nó muốn ăn, sinh vật trong hình được cho là nhìn xung quanh trong bán kính 149,64 (khoảng cách nhìn của nó) và đánh giá loại thức ăn nào nên theo đuổi, dựa trên dinh dưỡng, khoảng cách và loại (thịt hoặc thực vật) .
Chức năng chịu trách nhiệm tìm kiếm mọi sinh vật thức ăn của chúng là ăn khoảng 70% thời gian chạy. Đơn giản hóa cách viết hiện tại của nó, nó đi như thế này:
for (creature : all_creatures)
{
for (food : all_entities_with_food_value)
{
// if the food is within the creatures view and it's
// the best food found yet, it becomes the best food
}
// set the best food as the target for creature
// make the creature chase it (change its state)
}
Chức năng này được chạy mỗi tích tắc cho mọi sinh vật tìm kiếm thức ăn, cho đến khi sinh vật tìm thấy thức ăn và thay đổi trạng thái. Nó cũng chạy mỗi khi thức ăn mới sinh ra cho các sinh vật đang theo đuổi một loại thức ăn nào đó, để đảm bảo mọi người đều theo đuổi thức ăn tốt nhất có sẵn cho chúng.
Tôi cởi mở với những ý tưởng về cách làm cho quá trình này hiệu quả hơn. Tôi muốn giảm sự phức tạp từ , nhưng tôi không biết liệu điều đó có khả thi hay không.
Một cách tôi đã cải thiện nó là bằng cách sắp xếp all_entities_with_food_value
nhóm để khi một sinh vật lặp lại thức ăn quá lớn để nó ăn, nó dừng lại ở đó. Bất kỳ cải tiến nào khác đều được chào đón!
EDIT: Cảm ơn tất cả các bạn đã trả lời! Tôi đã thực hiện nhiều thứ từ nhiều câu trả lời khác nhau:
Trước tiên, tôi chỉ đơn giản là làm cho nó có chức năng phạm tội chỉ chạy một lần trong năm tích tắc, điều này làm cho trò chơi nhanh hơn gấp 4 lần, trong khi không thay đổi rõ ràng bất cứ điều gì về trò chơi.
Sau đó, tôi lưu trữ trong hệ thống tìm kiếm thực phẩm một mảng với thực phẩm được sinh ra trong cùng một dấu tích mà nó chạy. Bằng cách này, tôi chỉ cần so sánh thực phẩm mà sinh vật đang đuổi theo với những thực phẩm mới xuất hiện.
Cuối cùng, sau khi nghiên cứu phân vùng không gian và xem xét BVH và quadtree, tôi đã đi với cái sau, vì tôi cảm thấy nó đơn giản hơn và phù hợp hơn với trường hợp của tôi. Tôi thực hiện nó khá nhanh và hiệu suất được cải thiện đáng kể, việc tìm kiếm thực phẩm hầu như không mất thời gian!
Bây giờ kết xuất là thứ làm tôi chậm lại, nhưng đó là vấn đề cho một ngày khác. Cảm ơn tất cả!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
sẽ dễ dàng hơn việc thực hiện cấu trúc lưu trữ "phức tạp" NẾU nó đủ hiệu quả. (Liên quan: Nó có thể giúp chúng tôi nếu bạn đăng thêm một chút mã trong vòng lặp bên trong của bạn)