Эффективная память AI объекты для физики игры

Я создаю физическую игру в Java с использованием box2d.

Я пишу класс AI и хочу убедиться, что мои данные хранятся максимально эффективно с учетом выравнивания памяти.

Малейшее увеличение, скорее всего, будет иметь огромное значение, потому что я буквально запускаю «столько объектов ИИ, сколько могу», пока система не замедлится. Программа уже использует много памяти для обнаружения коллизий, потому что еще раз, я хочу быть в состоянии поддержать как можно больше агентов.

Что я понимаю до сих пор, так это то, что наименьший тип Java составляет 8 байт, и что объекты дополняются кратными 8. Я структурировал свои элементы управления AI в логических массивах, представляющих движение: x +/- 1, y +/- 1 и по часовой стрелке. / Вращения против часовой стрелки для определенных приборов.

Поскольку Java не имеет нулевых настроек для логических значений, я вложил элементы управления в объекты команд со значениями bool on_off и pos_neg. С движениями и поворотами я имею дело с примерно 7 объектами команд на одно действие по умолчанию (например, перемещение вправо). Поэтому я создаю массивы команд для каждого действия.

Мой вопрос: я делаю это эффективно?

Я не доработал дизайн, поэтому не уверен насчет размера каждого массива. Но, учитывая требования к выравниванию памяти, я думаю, у меня будет по крайней меренемного заполнение, которое в конечном итоге тратит впустую память. Я подумываю сделать что-то вроде обрезки размера объекта до предела заполнения, а затем перенести оставшиеся данные из нескольких объектов в объект «переполнения» ... или что-то в этом роде.

Это ускорит вещи? Почему или почему нет?

Я также рассматриваю возможность использования битовых наборов, хотя я думаю, что мои объекты команд, возможно, достигли аналогичного результата, и мне сказали, что сдвиг битов происходит медленно.

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)  //   
              },   
        };
}

Ответы на вопрос(1)

Ваш ответ на вопрос