พื้นหลังเล็กน้อยฉันเขียนโค้ดเกมวิวัฒนาการกับเพื่อนใน C ++ โดยใช้ ENTT สำหรับระบบเอนทิตี สิ่งมีชีวิตที่เดินไปรอบ ๆ ในแผนที่ 2 มิติกินสีเขียวหรือสิ่งมีชีวิตอื่นทำซ้ำและคุณสมบัติของพวกมันกลายพันธุ์
นอกจากนี้ประสิทธิภาพก็ดี (60fps ไม่มีปัญหา) เมื่อเกมทำงานแบบเรียลไทม์ แต่ฉันต้องการที่จะเพิ่มความเร็วอย่างมีนัยสำคัญโดยไม่ต้องรอ 4h เพื่อดูการเปลี่ยนแปลงที่สำคัญ ดังนั้นฉันต้องการได้เร็วที่สุด
ฉันกำลังดิ้นรนเพื่อหาวิธีที่มีประสิทธิภาพสำหรับสิ่งมีชีวิตในการค้นหาอาหารของพวกเขา สิ่งมีชีวิตแต่ละคนควรจะมองหาอาหารที่ดีที่สุดที่อยู่ใกล้พวกเขา
หากต้องการกินสิ่งมีชีวิตที่อยู่ในภาพควรจะมองไปรอบ ๆ ตัวเองในรัศมี 149.64 (ระยะการมองของมัน) และตัดสินว่าควรกินอาหารชนิดใดซึ่งขึ้นอยู่กับโภชนาการระยะทางและประเภท (เนื้อสัตว์หรือพืช) .
ฟังก์ชั่นที่รับผิดชอบในการค้นหาสิ่งมีชีวิตทุกชนิดของพวกเขาคือการกินอาหารประมาณ 70% ของเวลาใช้งาน ทำให้การเขียนง่ายขึ้นในขณะนี้มันจะเป็นดังนี้:
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)
}
ฟังก์ชั่นนี้ใช้งานทุกเห็บสำหรับสิ่งมีชีวิตที่กำลังมองหาอาหารจนกว่าสิ่งมีชีวิตจะค้นหาอาหารและเปลี่ยนสถานะ มันยังวิ่งทุกครั้งที่มีอาหารใหม่วางไข่สำหรับสิ่งมีชีวิตที่ไล่ล่าอาหารบางอย่างแล้วเพื่อให้แน่ใจว่าทุกคนจะไปตามอาหารที่ดีที่สุดสำหรับพวกเขา
ฉันเปิดรับแนวคิดเกี่ยวกับวิธีทำให้กระบวนการนี้มีประสิทธิภาพมากขึ้น ฉันชอบที่จะลดความซับซ้อนจากแต่ฉันไม่รู้ว่าเป็นไปได้หรือไม่
วิธีหนึ่งที่ฉันปรับปรุงอยู่แล้วคือการจัดall_entities_with_food_value
กลุ่มเพื่อให้สิ่งมีชีวิตซ้ำไปซ้ำมากินอาหารใหญ่เกินกว่าที่มันจะกินมันจะหยุดอยู่ตรงนั้น การปรับปรุงอื่น ๆ เป็นมากกว่าการต้อนรับ!
แก้ไข: ขอบคุณทุกท่านสำหรับคำตอบ! ฉันใช้สิ่งต่าง ๆ จากคำตอบต่าง ๆ :
ฉันทำอย่างแรกและเรียบง่ายเพื่อให้ฟังก์ชั่นความผิดทำงานเพียงแค่ทุก ๆ ห้าเห็บเท่านั้นมันทำให้เกมเร็วขึ้น 4x เท่าในขณะที่ไม่มีการเปลี่ยนแปลงอะไรเกี่ยวกับเกม
หลังจากนั้นฉันเก็บไว้ในระบบการค้นหาอาหารอาร์เรย์ที่มีอาหารวางไข่ในเห็บเดียวกับที่มันทำงาน ด้วยวิธีนี้ฉันเพียงแค่ต้องเปรียบเทียบอาหารที่สัตว์กำลังไล่ล่ากับอาหารใหม่ที่ปรากฏ
สุดท้ายหลังจากการวิจัยเกี่ยวกับการแบ่งพื้นที่และพิจารณา BVH และ quadtree ฉันไปกับหลังเพราะฉันรู้สึกว่ามันง่ายและเหมาะกับกรณีของฉัน ฉันใช้มันอย่างรวดเร็วและปรับปรุงประสิทธิภาพอย่างมากการค้นหาอาหารแทบจะไม่ต้องใช้เวลาเลย!
ตอนนี้การแสดงผลคือสิ่งที่ทำให้ช้าลงของฉัน แต่นั่นเป็นปัญหาสำหรับอีกวัน ขอบคุณทุกคน!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
ควรง่ายกว่าการนำโครงสร้างการจัดเก็บข้อมูล "ซับซ้อน" ไปใช้ถ้ามันมีประสิทธิภาพเพียงพอ (ที่เกี่ยวข้อง: มันอาจช่วยเราได้ถ้าคุณโพสต์โค้ดอีกเล็กน้อยในวงในของคุณ)