Un peu de contexte, je suis en train de coder un jeu d' évolution avec un ami en C ++, en utilisant ENTT pour le système d'entités. Les créatures se promènent sur une carte 2D, mangent des verts ou d'autres créatures, se reproduisent et leurs traits mutent.
De plus, les performances sont bonnes (60 images par seconde sans problème) lorsque le jeu est exécuté en temps réel, mais je veux pouvoir l'accélérer considérablement pour ne pas avoir à attendre 4h pour voir des changements importants. Je veux donc l'obtenir le plus rapidement possible.
J'ai du mal à trouver une méthode efficace pour que les créatures trouvent leur nourriture. Chaque créature est censée chercher la meilleure nourriture qui soit assez proche d'elle.
Si elle veut manger, la créature représentée au centre est censée regarder autour d'elle dans un rayon de 149,64 (sa distance de vue) et juger quelle nourriture elle doit rechercher, qui est basée sur la nutrition, la distance et le type (viande ou plante) .
La fonction chargée de trouver à chaque créature sa nourriture consomme environ 70% du temps d'exécution. Simplifiant la façon dont il est écrit actuellement, il ressemble à ceci:
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)
}
Cette fonction est exécutée à chaque tick pour chaque créature à la recherche de nourriture, jusqu'à ce que la créature trouve de la nourriture et change d'état. Il est également exécuté à chaque fois que de nouveaux aliments apparaissent pour les créatures qui poursuivent déjà un certain aliment, pour s'assurer que tout le monde cherche le meilleur aliment qui leur soit disponible.
Je suis ouvert aux idées sur la façon de rendre ce processus plus efficace. J'adorerais réduire la complexité de , mais je ne sais pas si c'est même possible.
Une façon dont je l'ai déjà amélioré est de trier le all_entities_with_food_value
groupe de sorte que lorsqu'une créature parcourt des aliments trop gros pour être mangés, elle s'arrête là. Toute autre amélioration est plus que bienvenue!
EDIT: Merci à tous pour les réponses! J'ai implémenté différentes choses à partir de différentes réponses:
J'ai tout d'abord et simplement fait en sorte que la fonction coupable ne s'exécute qu'une fois tous les cinq ticks, ce qui a rendu le jeu environ 4x plus rapide, sans rien changer visiblement au jeu.
Après cela, j'ai stocké dans le système de recherche de nourriture un tableau avec la nourriture engendrée dans la même coche qu'elle fonctionne. De cette façon, je n'ai besoin que de comparer la nourriture que la créature poursuit avec les nouveaux aliments qui sont apparus.
Enfin, après des recherches sur le partitionnement de l'espace et en considérant BVH et quadtree, je suis allé avec ce dernier, car j'ai l'impression que c'est beaucoup plus simple et mieux adapté à mon cas. Je l'ai implémenté assez rapidement et il a considérablement amélioré les performances, la recherche de nourriture prend à peine du temps!
Maintenant, le rendu est ce qui me ralentit, mais c'est un problème pour un autre jour. Merci à tous!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
devrait être plus facile que l'implémentation d'une structure de stockage "compliquée" SI elle est suffisamment performante. (Rapporté: Il pourrait nous aider si vous avez publié un peu plus du code dans votre boucle interne)