Un poco de historia, estoy codificando un juego de evolución con un amigo en C ++, usando ENTT para el sistema de entidades. Las criaturas caminan en un mapa 2D, comen verdes u otras criaturas, se reproducen y sus rasgos mutan.
Además, el rendimiento está bien (60 fps sin problema) cuando el juego se ejecuta en tiempo real, pero quiero poder acelerarlo significativamente para no tener que esperar 4 horas para ver cambios significativos. Así que quiero obtenerlo lo más rápido posible.
Estoy luchando por encontrar un método eficiente para que las criaturas encuentren su comida. Se supone que cada criatura debe buscar la mejor comida que esté lo suficientemente cerca de ellos.
Si quiere comer, se supone que la criatura que se muestra en el centro mira a su alrededor en un radio de 149.64 (su distancia de visión) y juzga qué alimento debe buscar, que se basa en la nutrición, la distancia y el tipo (carne o planta) .
La función responsable de encontrar a cada criatura su comida es consumir alrededor del 70% del tiempo de ejecución. Simplificando cómo se escribe actualmente, es algo así:
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 función se ejecuta cada tic para cada criatura que busca comida, hasta que la criatura encuentre comida y cambie de estado. También se ejecuta cada vez que se genera una nueva comida para criaturas que ya persiguen una comida determinada, para asegurarse de que todos persigan la mejor comida disponible para ellos.
Estoy abierto a ideas sobre cómo hacer que este proceso sea más eficiente. Me encantaría reducir la complejidad de , pero no sé si eso es posible.
Una forma en que ya lo mejoro es clasificando el all_entities_with_food_value
grupo para que cuando una criatura repita sobre comida demasiado grande para comer, se detenga allí. ¡Cualquier otra mejora es más que bienvenida!
EDITAR: ¡Gracias a todos por las respuestas! Implementé varias cosas de varias respuestas:
Primero y simplemente lo hice para que la función de culpabilidad solo se ejecute una vez cada cinco tics, esto hizo que el juego fuera 4 veces más rápido, sin cambiar visiblemente nada sobre el juego.
Después de eso, almacené en el sistema de búsqueda de alimentos una matriz con la comida generada en el mismo tic que ejecuta. De esta manera, solo necesito comparar la comida que la criatura persigue con las nuevas comidas que aparecieron.
Por último, después de investigar la partición del espacio y considerar BVH y quadtree, elegí este último, ya que siento que es mucho más simple y más adecuado para mi caso. Lo implemento bastante rápido y mejoró enormemente el rendimiento, ¡la búsqueda de alimentos apenas toma tiempo!
Ahora renderizar es lo que me está frenando, pero eso es un problema para otro día. ¡Gracias a todos!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
debería ser más fácil que implementar una estructura de almacenamiento "complicada" SI es lo suficientemente eficiente. (Relacionado: podría ayudarnos si publicara un poco más del código en su bucle interno)