Um pouco de experiência, estou codificando um jogo de evolução com um amigo em C ++, usando ENTT para o sistema de entidades. As criaturas andam em um mapa 2D, comem verduras ou outras criaturas, se reproduzem e suas características mudam.
Além disso, o desempenho é bom (60fps sem problemas) quando o jogo é executado em tempo real, mas eu quero ser capaz de acelerar significativamente para não ter que esperar 4h para ver alterações significativas. Então, eu quero obtê-lo o mais rápido possível.
Estou lutando para encontrar um método eficiente para as criaturas encontrarem sua comida. Cada criatura deve procurar a melhor comida que esteja perto o suficiente deles.
Se quiser comer, a criatura retratada no centro deve olhar em torno de si em um raio de 149,64 (sua distância de visão) e julgar qual alimento deve buscar, com base na nutrição, distância e tipo (carne ou planta) .
A função responsável por encontrar todas as criaturas que sua comida consome cerca de 70% do tempo de execução. Simplificando como está escrito atualmente, é mais ou menos assim:
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)
}
Esta função é executada a cada escala para todas as criaturas que procuram comida, até que a criatura encontre comida e mude de estado. Também é executada toda vez que novos alimentos aparecem para criaturas que já perseguem um determinado alimento, para garantir que todos sigam a melhor comida disponível para eles.
Estou aberto a idéias sobre como tornar esse processo mais eficiente. Adoraria reduzir a complexidade de , mas não sei se isso é possível.
Uma maneira de eu já melhorar é classificando o all_entities_with_food_value
grupo para que, quando uma criatura interage com alimentos grandes demais para comer, pare por aí. Quaisquer outras melhorias são mais que bem-vindas!
EDIT: Obrigado a todos pelas respostas! Eu implementei várias coisas de várias respostas:
Em primeiro lugar, eu simplesmente fiz isso para que a função culpada fosse executada apenas uma vez a cada cinco ticks, o que tornava o jogo cerca de 4x mais rápido, sem alterar visivelmente nada sobre o jogo.
Depois disso, guardei no sistema de busca de alimentos uma matriz com os alimentos gerados no mesmo carrapato que ele executa. Dessa forma, eu só preciso comparar os alimentos que a criatura está perseguindo com os novos que apareceram.
Por fim, depois de pesquisar o particionamento espacial e considerar o BVH e o quadtree, fui com o último, pois sinto que é muito mais simples e mais adequado ao meu caso. Eu o implementei rapidamente e melhorou muito o desempenho, a pesquisa de alimentos mal leva tempo!
Agora a renderização é o que está me atrasando, mas isso é um problema para outro dia. Obrigado a todos!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
deve ser mais fácil do que implementar uma estrutura de armazenamento "complicada", se tiver desempenho suficiente. (Relacionado: Pode nos ajudar se você postar um pouco mais do código em seu loop interno)