【发布时间】:2016-02-23 03:07:47
【问题描述】:
我正在使用 box2d 在 java 中创建一个物理游戏。
我正在编写一个 AI 类,并希望确保我的数据尽可能高效地存储,同时考虑到内存对齐。
最小的增加可能会产生巨大的影响,因为我实际上是在运行“尽可能多的 AI 对象”,直到系统变慢。程序已经在碰撞检测中使用了大量内存,因为再一次,我希望能够支持尽可能多的代理。
到目前为止,我所了解的是,最小的 Java 类型是 8 字节,并且对象被填充为 8 的倍数。我在布尔数组中构建了我的 AI 控件,表示运动:x+/-1,y+/-1 ,以及某些灯具的顺时针/CCW 旋转。
由于 Java 没有布尔值的空设置,我将控件嵌套在命令对象中,布尔值 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) //
},
};
}
【问题讨论】:
-
为了提高您的描述的清晰度(并更有效地吸引答案),请在您的问题中包含一些代码 sn-ps 以说明您的观点。
标签: java object memory-management artificial-intelligence memory-alignment