Biraz arka plan, C ++ 'ta bir arkadaşımla bir evrim oyununu varlık sistemi için ENTT kullanarak kodluyorum. Yaratıklar 2B bir harita üzerinde dolaşıyor, yeşillikleri ve diğer canlıları yiyor, ürüyorlar ve özellikleri değişiyor.
Ayrıca, oyun gerçek zamanlı olarak çalıştırıldığında performans iyi (60fps sorun yok), ancak önemli değişiklikleri görmek için 4 saat beklemek zorunda kalmamak için önemli ölçüde hızlandırabilmek istiyorum. Bu yüzden mümkün olduğunca hızlı almak istiyorum.
Yaratıkların yiyeceklerini bulmaları için etkili bir yöntem bulmakta zorlanıyorum. Her yaratığın, kendilerine yeterince yakın olan en iyi yemeği araması gerekir.
Yemek yemek istiyorsa, merkezde gösterilen yaratığın 149.64 yarıçapında (görüş mesafesi) kendi etrafına bakması ve hangi yiyeceğe bakması gerektiğini, hangisinin beslenmeye, mesafeye ve türüne (et veya bitki) dayandığına karar vermesi beklenir. .
Her canlının yiyeceklerini bulmaktan sorumlu olan fonksiyon, çalışma zamanının% 70'ini yiyor. Şu anda nasıl yazıldığını basitleştirerek, şöyle bir şeye gider:
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)
}
Bu işlev, yiyecek arayan ve durum değiştirene kadar, yiyecek arayan her yaratığın her bir kene çalıştırılır. Ayrıca, herkesin kendilerine sunduğu en iyi yemeğin peşinden gitmesini sağlamak için, yeni yiyecekler zaten belli bir yiyeceği kovalayan yaratıklar için ortaya çıkar.
Bu sürecin nasıl daha verimli hale getirileceğine dair fikirlere açığım. Karmaşıklığı den düşürmeyi çok isterdim , ama bunun mümkün olup olmadığını bile bilmiyorum.
Zaten geliştirdiğim bir yöntem all_entities_with_food_value
grubu, bir yaratığın yiyeceği yemek için çok büyük bir yineleme yaptığında durduracak şekilde gruplamasıdır. Diğer iyileştirmeler memnuniyetle karşılanır!
EDIT: Cevaplarınız için hepinize teşekkür ederim! Çeşitli cevaplardan çeşitli şeyler uyguladım:
Öncelikle ve basitçe yaptım ki suçluluk fonksiyonu her beş tene sadece bir kez koşuyordu, bu da oyunun 4x etrafında daha hızlı olmasına neden oldu;
Ondan sonra yiyecek arama sisteminde sakladığım yiyecekle aynı kene içinde bulunan yiyecekleri içeren bir dizi oluşturdum. Bu şekilde, yaratığın koyduğu yiyecekleri sadece ortaya çıkan yeni yiyeceklerle karşılaştırmam gerekiyor.
Son olarak, alanın bölünmesi ve BVH ve dörtlünün göz önünde bulundurulması üzerine araştırma yaptıktan sonra, sonuncusuna gittim, sanki davama çok daha basit ve daha uygun olduğunu hissediyorum. Oldukça hızlı bir şekilde uyguluyorum ve performansı oldukça artırdım, yiyecek arama neredeyse hiç zaman alıyor!
Şimdi render yapmak benim yavaşlatan şey, ama bu başka bir gün için bir sorun. Hepinize teşekkür ederim!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
Yeterli performans göstermesi durumunda, "karmaşık" bir depolama yapısı uygulamaktan daha kolay eklenmesi gerekir. (İlgili: İçsel döngünüzdeki kodun biraz daha fazlasını gönderirseniz bize yardımcı olabilir)