Эффективная память 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) //
},
};
}