Sedikit latar belakang, saya mengkodekan permainan evolusi dengan seorang teman di C ++, menggunakan ENTT untuk sistem entitas. Makhluk berjalan di peta 2D, makan sayuran atau makhluk lain, bereproduksi dan sifat-sifatnya bermutasi.
Selain itu, kinerjanya baik-baik saja (60fps tidak masalah) saat permainan dijalankan secara real time, tetapi saya ingin dapat mempercepatnya secara signifikan agar tidak harus menunggu 4 jam untuk melihat perubahan signifikan. Jadi saya ingin mendapatkannya secepat mungkin.
Saya berjuang untuk menemukan metode yang efisien bagi makhluk untuk menemukan makanan mereka. Setiap makhluk seharusnya mencari makanan terbaik yang cukup dekat dengan mereka.
Jika ingin makan, makhluk yang digambarkan di tengah seharusnya melihat sekelilingnya dalam radius 149,64 (jarak pandangnya) dan menilai makanan mana yang harus dibelinya, yang didasarkan pada nutrisi, jarak, dan jenis (daging atau tanaman) .
Fungsi yang bertanggung jawab untuk menemukan setiap makhluk makanan mereka memakan sekitar 70% dari waktu berjalan. Menyederhanakan bagaimana yang ditulisnya saat ini, bisa jadi begini:
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)
}
Fungsi ini dijalankan setiap centang untuk setiap makhluk mencari makanan, sampai makhluk menemukan makanan dan mengubah keadaan. Ini juga dijalankan setiap kali makanan baru memunculkan makhluk yang sudah mengejar makanan tertentu, untuk memastikan semua orang mencari makanan terbaik yang tersedia untuk mereka.
Saya terbuka pada ide tentang bagaimana membuat proses ini lebih efisien. Saya ingin mengurangi kompleksitas dari , tetapi saya tidak tahu apakah itu mungkin.
Salah satu cara saya sudah memperbaikinya adalah dengan menyortir all_entities_with_food_value
kelompok sehingga ketika seekor makhluk beralih pada makanan yang terlalu besar untuk dimakan, ia berhenti di sana. Setiap perbaikan lain lebih dari diterima!
EDIT: Terima kasih semua atas balasannya! Saya menerapkan berbagai hal dari berbagai jawaban:
Saya pertama dan hanya membuatnya sehingga fungsi bersalah hanya berjalan sekali setiap lima kutu, ini membuat game sekitar 4x lebih cepat, sementara tidak terlihat mengubah apa pun tentang game.
Setelah itu saya menyimpan di dalam sistem pencarian makanan sebuah array dengan makanan yang muncul dalam tanda centang yang sama dengan yang dijalankannya. Dengan cara ini saya hanya perlu membandingkan makanan yang dikejar makhluk itu dengan makanan baru yang muncul.
Terakhir, setelah meneliti partisi ruang dan mempertimbangkan BVH dan quadtree, saya memilih yang terakhir, karena saya merasa jauh lebih sederhana dan lebih cocok untuk kasus saya. Saya menerapkannya dengan sangat cepat dan sangat meningkatkan kinerja, pencarian makanan hampir tidak membutuhkan waktu sama sekali!
Sekarang rendering adalah apa yang memperlambat saya, tapi itu masalah untuk hari lain. Terima kasih semua!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
harus lebih mudah daripada menerapkan struktur penyimpanan "rumit" JIKA itu cukup performan. (Terkait: Ini mungkin membantu kami jika Anda mengunggah kode lebih banyak di loop dalam Anda)