Ein wenig Hintergrund, ich bin Codierung eine Evolution Spiel mit einem Freund in C ++, ENTT für das Entity - System. Kreaturen bewegen sich in einer 2D-Karte, fressen Greens oder andere Kreaturen, vermehren sich und ihre Eigenschaften mutieren.
Darüber hinaus ist die Leistung in Ordnung (60fps kein Problem), wenn das Spiel in Echtzeit ausgeführt wird, aber ich möchte es deutlich beschleunigen können, damit ich nicht 4 Stunden warten muss, um signifikante Änderungen zu sehen. Also möchte ich es so schnell wie möglich bekommen.
Ich kämpfe darum, eine effiziente Methode zu finden, mit der Kreaturen ihre Nahrung finden können. Jede Kreatur soll nach dem besten Futter suchen, das ihnen nahe genug ist.
Wenn es essen will, soll sich die in der Mitte abgebildete Kreatur in einem Radius von 149,64 (Blickentfernung) umsehen und beurteilen, welche Nahrung es verfolgen soll, basierend auf Ernährung, Entfernung und Art (Fleisch oder Pflanze). .
Die Funktion, die dafür verantwortlich ist, jedes Lebewesen zu finden, verbraucht ungefähr 70% der Laufzeit. Vereinfacht gesagt, sieht es so aus:
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)
}
Diese Funktion wird bei jedem Tick für jede Kreatur ausgeführt, die nach Nahrung sucht, bis die Kreatur Nahrung findet und ihren Zustand ändert. Es wird auch jedes Mal ausgeführt, wenn neue Lebensmittel für Kreaturen auftauchen, die bereits ein bestimmtes Lebensmittel jagen, um sicherzustellen, dass jeder das beste Lebensmittel sucht, das ihm zur Verfügung steht.
Ich bin offen für Ideen, wie dieser Prozess effizienter gestaltet werden kann. Ich würde gerne die Komplexität von reduzieren , aber ich weiß nicht, ob das überhaupt möglich ist.
Eine Möglichkeit, die ich bereits verbessert habe, besteht darin, die all_entities_with_food_value
Gruppe so zu sortieren , dass eine Kreatur, die über Lebensmittel iteriert, die zu groß sind, um sie zu fressen, dort anhält. Alle anderen Verbesserungen sind mehr als willkommen!
EDIT: Vielen Dank für die Antworten! Ich habe verschiedene Dinge aus verschiedenen Antworten implementiert:
Ich habe es erstens einfach so gemacht, dass die Schuldfunktion nur einmal alle fünf Ticks ausgeführt wird. Dies hat das Spiel um das Vierfache beschleunigt, ohne dass sich etwas an dem Spiel sichtbar verändert hat.
Danach habe ich im Nahrungsmittelsuchsystem ein Array mit der Nahrung gespeichert, die im selben Häkchen erzeugt wurde, wie es ausgeführt wird. Auf diese Weise muss ich nur die Nahrung, die die Kreatur jagt, mit den neuen Nahrungsmitteln vergleichen, die aufgetaucht sind.
Nachdem ich mich mit Raumteilung befasst und BVH und Quadtree in Betracht gezogen hatte, habe ich mich für Letzteres entschieden, da ich der Meinung bin, dass dies viel einfacher und besser für meinen Fall geeignet ist. Ich implementiere es ziemlich schnell und es hat die Leistung erheblich verbessert, die Nahrungssuche dauert kaum irgendwann!
Das Rendern verlangsamt mich, aber das ist ein Problem für einen anderen Tag. Danke euch allen!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
sollte einfacher sein als das Implementieren einer "komplizierten" Speicherstruktur, WENN sie performant genug ist. (Siehe auch: Es könnte uns helfen, wenn Sie etwas mehr Code in Ihrer inneren Schleife veröffentlichen.)