edächtniseffiziente KI-Objekte für das Physikspi

Ich erstelle ein Physikspiel in Java mit box2d.

Ich schreibe eine AI-Klasse und möchte sicherstellen, dass meine Daten unter Berücksichtigung der Speicherausrichtung so effizient wie möglich gespeichert werden.

Die kleinste Zunahme wird wahrscheinlich einen großen Unterschied machen, da ich buchstäblich so viele KI-Objekte laufen lasse, wie ich kann, bis das System langsamer wird. Das Programm belegt bereits sehr viel Speicher für die Kollisionserkennung, weil ich es wieder einmal möchte in der Lage zu sein, so viele Agenten wie möglich zu unterstützen.

Was ich bis jetzt verstehe, ist, dass der kleinste Java-Typ 8 Byte ist und dass Objekte in Vielfachen von 8 aufgefüllt werden. Ich habe meine AI-Steuerelemente in boolesche Arrays strukturiert, die Bewegung darstellen: x +/- 1, y +/- 1 und Drehung im Uhrzeigersinn / gegen den Uhrzeigersinn für bestimmte Vorrichtungen.

Da Java keine Null-Einstellungen für Boolesche Werte hat, habe ich die Steuerelemente in Befehlsobjekten mit den Bool-Werten on_off und pos_neg verschachtelt. Bei den Bewegungen und Rotationen habe ich es mit ungefähr 7 Befehlsobjekten pro 'Standard'-Aktion zu tun (z. B. nach rechts bewegen). Also erstelle ich Command Arrays für jede Aktion.

Meine Frage ist: Mache ich das effizient?

Ich habe das Design noch nicht fertiggestellt, daher bin ich mir über die Größe der einzelnen Arrays nicht sicher. Aber angesichts der Anforderungen an die Speicherausrichtung schätze ich, dass ich mindestens @ haben werdetwa padding, was letztendlich Speicherplatz verschwendet. Ich überlege, etwas zu tun, um die Objektgröße an die Auffüllgrenze anzupassen und dann die verbleibenden Daten von mehreren Objekten in ein Objekt mit Überlauf zu verschieben ... oder so ähnlich.

Wird dies die Dinge beschleunigen? Warum oder warum nicht

Ich erwäge auch die Verwendung von Bitsets, obwohl ich glaube, dass meine Befehlsobjekte ein ähnliches Ergebnis erzielt haben, und mir wurde gesagt, dass die Bitverschiebung langsam ist.

public class Command {

        boolean on_off  = false;
        boolean pos_neg = false;
}

public class DefaultMoves {

    //Note: these arrays are 2d in the event multiples are necessary
    //to complete a single action, I may change this later.
    Command[][] mvRight =    
        { 
              {     new Command(false, false), //
                    new Command(false, false), //
                    new Command(false, false), //
                    new Command(false, false), //
                    new Command(false, false), //
                    new Command(true, true), //moveX
                    new Command(false, false)  //   
              },   
        };
    Command[][] mvLeft =    
        { 
              {     new Command(false, false), //
                    new Command(false, false), //
                    new Command(false, false), //
                    new Command(false, false), //
                    new Command(false, false), //
                    new Command(true, false), //moveX
                    new Command(false, false)  //   
              },   
        };
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage