BerickCook hat die Idee richtig ausgedrückt. Lassen Sie die Berechnungen dort, wo sie sind, wenn sie jetzt richtig funktionieren.
Wenn Sie die Berechnung vorher durchführen können und sicher sind, dass Sie sie während des Spiels nicht benötigen, tun Sie dies vorher. Andernfalls tun Sie es nach dem Laden. Wenn die Berechnung während des Spiels nicht bemerkt wird, können Sie sie dort ausführen. Wenn sich irgendwann die Komplexität entwickelt und die Berechnungen zu schwer werden, beginnen Sie mit der Optimierung.
Aber eines: Wenn Ihre Berechnungen so implementiert sind, dass sie während des Spiels ausgeführt werden, können Sie sie jederzeit zwingen, während des Ladens ausgeführt zu werden.
Es gibt zahlreiche Lösungen:
- Berechnen / Laden Sie die Pfade während der Levelerstellung / des Ladens
- Verwenden Sie einen zweiten Thread, um die Pfade zu berechnen
- Optimieren Sie Ihre Algorithmen
- Verwenden Sie ein unterbrechbares System, wenn Sie keinen Zugriff auf Threading haben.
Ich habe die letzte Option in einem Massenmarktspiel gesehen und verwendet. Stellen Sie einfach sicher, dass Sie alle Daten ordnungsgemäß speichern, damit die Berechnung fortgesetzt werden kann, und überprüfen Sie regelmäßig die verbleibende Zeit / den verbleibenden Betrieb während der Berechnung.
Abhängig von Ihrem Fall kann das unterbrechbare System vorläufige und Teillösungen liefern, die verwendet werden können, bevor die Berechnung beendet ist.
Bearbeiten : @Keeper beantworten
Der "unterbrechbare Algorithmus" war nur aufgrund der Einschränkungen nützlich, die wir hatten. Grundsätzlich haben wir den Mangel an Multithreading gelindert.
Irgendwann hatten wir ein Spiel, in dem die KI große Mengen an Zügen basierend auf mehreren Wörterbüchern berechnen musste. Während dieser Berechnung wurden alle Animationen gestoppt, da die Wörterbücher mit mehr Daten erweitert wurden und der Datensatz mit den Daten geändert wurde und weniger effizient war, wenn das Spiel für den Mehrspielermodus angepasst wurde (wobei die KI selbst für die Züge des Spielers interagieren musste). Wir hatten nur einen Thread für die Spieleschleife verfügbar (das Gebot ist, dass der Multi-Plattform-Code auf allen unterstützten Plattformen ausgeführt werden muss). Zu diesem Zeitpunkt wurde beschlossen, den Berechnungsalgorithmus zu unterbrechen, damit wir ihn unterbrechen können. Daher konnten wir nicht einfach das vorhandene rekursive System verwenden, da Variablen nicht gespeichert werden konnten. Die Funktionen wurden durch Objekte ersetzt, die einfach alle erforderlichen Variablen und Zeiger auf übergeordnete und untergeordnete Objekte enthielten. Ich nicht
- Speichern Sie den Status der aktuellen Berechnungen
- entweder am Ende einer Schleife oder während einer Schleife unterbrechen (wenn ein untergeordnetes Objekt unterbricht)
- Beenden Sie, wenn die Zeit abgelaufen ist
- Fortsetzen, wenn entweder eine Neustart einer Schleife am rechten Index gestoppt oder das untergeordnete Objekt aufgerufen wird, das sich derzeit oben auf dem untergeordneten Stapel befindet.
- Reinigen Sie alles, wenn die Berechnung unterbrochen wird
- Geben Sie das beste Teilergebnis.
Nur die teuersten Operationen wurden in separate Objekte aufgeteilt und es dauerte einige Zeit, um die richtigen Stellen zu finden, an denen wir die Berechnungen stoppen konnten, aber am Ende funktioniert es sehr gut.
Wir haben an Leistung verloren, aber die wahrgenommene Leistung war für den Benutzer viel besser, da Animationen auf allen Plattformen reibungslos liefen. Alle Plattformen konnten dann die größeren Wörterbücher verwenden, ohne unter abgehackten Animationen oder Einfrierungen zu leiden. Dies ermöglichte es uns auch, mehrere Instanzen parallel auszuführen, wenn wir sie später benötigten.
Natürlich braucht das Spiel dies jetzt auf dem iPhone und iPad nicht mehr. Die Verwendung eines zweiten Threads wäre ideal. Aber ich vermute, der Code ist noch da.