Ich habe mit dem aktuellen Framework ein kleines Problem (ja, ich weiß, wieder mal :oops
. Dieses mal ist es ein Detail der variablen Zeitschritte.
Ein Kommentar sagt "Die KIs werden einmal pro Frame aufgerufen.". Leider bedeutet das jedoch
nicht, dass dieser Aufruf immer zu Beginn des Frames stattfindet. Tatsächlich sind die zeitlichen Abstände zwischen zwei KI Aufrufen
variabel,
Beispiel: der Ball kollidiert nach 0.9 Zeiteinheiten mit der Bande. Der aktuelle Simulationsschritt wird folglich auf diese 0.9 Zeiteinheiten beschränkt.
Da der Schritt jedoch nicht den gewünschten 1.0 Zeiteinheiten entsprach, werden die KIs zu beginn des folgenden Simulationsschritts
nicht aufgerufen (da sie in diesem Zeitabschnitt ihren Steuerbefehl ja bereits gegeben haben).
Dieser folgende Simulationsschritt wird aber in aller Regel wieder über die vollen 1.0 Zeiteinheiten simuliert werden (Konstellationen in der Spielfeldecke mal außer Acht gelassen).
Dadurch bleibt der Bewegungsbefehl der KI für 1.9 Zeiteinheiten gültig.
Im weiteren Verlauf ist es durch die Diskrepanz zwischen gs.time und real_time auch möglich, dass eine KI Entscheidung weniger als 1.0 Zeiteinheiten ausgeführt wird.
(Im obigen Beispiel wäre das der Fall, wenn der nächste zeitlich begrenzte Simulationsschritt in z.B. nach 0.2 Zeiteinheiten statt fände, da X.9 + 0.2 = (X+1).1, der darauf folgende Simulationsschritt also wieder die KI laufen lassen würde, und somit der Befehl lediglich 0.2 Zeiteinheiten ausgeführt würde.)
Eine mögliche Korrektur könnte es sein, den aktuellen Simulationszeitschritt nicht auf 1.0 Zeiteinheiten, sondern auf die Differenz zum nächsten ganzzahligen Zeitpunkt zu beschränken. Somit würden kritische Bewegungsabschnitte wie beabsichtigt separat in zeitlich beschränkten Schritten simuliert, diese würden sich aber wiederum zu 1.0 Zeiteinheiten aufaddieren und dadurch eine KI-Ausführung alle 1.0 Zeitschritte erlauben. Aussehen würde das so:
|
C-/C++-Quelltext
|
1
2
3
|
// in do_game()
//safe_dt = std::min(safe_dt, 1.0f);
safe_dt = std::min(safe_dt, float (gs.time + 1) - real_time);
|
Nicht, dass ich diesen Umstand nicht in meiner KI kompensieren könnte. Das beschriebene Phänomen verkompliziert jedoch das kontrollierte Spielen des Balls ein wenig, und möglicher Weise ist sich nicht jede/r darüber im klaren. Jetzt wisst ihr Bescheid