- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用box2d在Java中创建一个物理游戏。
我正在编写一个AI类,并希望在考虑内存对齐的情况下确保尽可能高效地存储我的数据。
最小的增加可能会产生巨大的变化,因为我实际上正在“尽可能多地运行AI对象”,直到系统变慢为止。该程序已经在碰撞检测中使用了大量内存,因为我想再次能够支持尽可能多的代理商。
到目前为止,我了解到的是,最小的Java类型是8个字节,并且对象被填充为8的倍数。我已将我的AI控件构造为布尔数组,表示运动:x +/- 1,y +/- 1和顺时针方向/ CCW旋转用于某些灯具。
由于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) //
},
};
}
最佳答案
这只是一个评论,但是有点冗长,我不想把它写成3条评论。
由于这是另一个后续问题,因此我将从“停止担心填充”开始。担心您如何存储数据。
而且,如果您要担心事情占用多少空间,请分配7个对象组成的数组,而不是7个单独的对象。我确定Java每次分配都有开销。在典型的C或C ++实现中,每个new
或malloc
的分配超出实际分配的数据大小的16-32个字节,并且将其舍入为16或32个字节。在Java中,建议here对象的内存开销为8个字节-这可能不适用于所有Java VM和实现。
此外,所有时空优化都是时空之间的折衷(至少几乎总是如此),因此以更紧凑的形式存储数据将节省时间,从而节省了空间。例如,我可以认为在较大的整数结构中将成对的on_off
和pos_neg
作为两个位。因此,您的7个命令将存储在一个整数中。但是,现在您必须进行移位和屏蔽才能获取正确的数据。同样,如果要存储某些内容,请转移和操作。 (因为我不太了解Java,所以我将其编写为C)。
/* This is big enough for 16 pairs of on_off and pos_neg */
/* In a pair of bits, bit 0 = on_off, bit 1 = pos_neg */
uint32_t cmdData;
/* Get values of on_off and pos_neg for element number n */
void getData(int n, bool& on_off, bool& pos_neg)
{
uint32_t shifted = cmdData >> (2 * n);
on_off = (shifted & 1) != 0;
pos_neg = (shifted & 2) != 0;
}
/* Store values for element n */
void setData(int n, bool on_off, bool pos_neg)
{
uint32_t bits = (int)on_off + (2 * (int)pos_neg);
uint32_t mask = 3 << (n * 2);
cmdData &= ~mask; /* Clear bits */
cmdData |= bits << (n * 2);
}
{on_off, pos_neg}
,而不是每个(可能)占用一个字节。但是,要深入了解它们,您每次都必须做一些额外的操作(并且代码变得更加混乱)。是否“值得拥有”在很大程度上取决于情况,访问这些对象的频率与系统内存的低低(假设这些对象的内存使用量是造成问题的原因-如果您有100个命令结构,并且使用该命令的40000000个对象,那么这些命令就不会成为问题。
int8_t
[java中的
byte
]),例如,按住
+1
进行向右或向下移动,
-1
向左或向上移动。这不是最紧凑的形式,但是它可以轻松访问和轻松计算新职位。
struct direction
{
int x, y;
};
direction directions[] =
{
{ 0, 0 }, // Don't move.
{ 0, 1 }, // Right.
{ 0, -1 }, // Left.
{ 1, 0 }, // Down.
{ -1, 0 }, // Up.
};
{ 1, 1 }, {-1, 1}
等组合添加另外四对。
xDir, yDir
值应用于可移动的对象。
1 2 3 4
a a a x
b b b x
c c c x
d d d x
1 2 3 4
a a a b
b b c c
c d d d
关于java - 物理游戏的内存高效AI对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33829894/
我一直在寻找游戏/模拟解决方案,以便在时间流逝时寻找距离,但这不是我要找的。 我正在寻找一个 O(1) 公式来计算(0 或 1 或 2)时钟时间,其中两个圆圈彼此之间的距离恰好为 r1+r2。负时间是
我究竟做错了什么? > crossprod(1:3,4:6) [,1] [1,] 32 根据本网站:http://onlinemschool.com/math/assistance/ve
嗨,我目前正在为类开发一个迷你游戏(第一次做这样的事情),我根本不知道如何开始碰撞检测。好吧,我正在创建的游戏是一款在冰冷的圆形竞技场上自上而下的相扑格斗游戏,您可以四处移动以获得动力和速度,并尝试击
这段代码取自使用 XNA 框架构建的游戏。我想从三角学和物理学的角度解释一下它是如何工作的。 ball.velocity = new Vector2((float)Math.Cos(cannon.ro
因此,我正在努力自学 Canvas (HTML5) 并编写了大部分简单的游戏引擎代码。它是空间场景(行星、恒星、天体等)的二维表示。我的默认“Sprite”类有一个像这样的帧监听器: “baseCla
这个问题在这里已经有了答案: Are the physical memory addresses of an array also stored in order like the virtual o
我正在尝试阅读英特尔软件开发人员手册以了解操作系统的工作原理,这四个寻址术语让我感到困惑。以上是我的理解,如有不对请指正。 线性地址 : 对一个孤立的程序来说,似乎是一长串以地址0开头的内存。该程序的
我尝试在 AndEngine 示例包中复制并粘贴物理示例。 没有出现错误,但当我运行它时,模拟器显示“不幸的是,PhysicsActivity 已停止”。 模拟器使用 API 15,GPU 已开启,磁
当我运行此代码时,第一行 CollisionWithplayer 给了我一个错误的指令错误。该错误不会每次都会出现,只是偶尔出现一次,并且没有类似的条件来确定导致该错误的原因。 func didBeg
您好,我有以下 Canvas 应用程序:http://dev.driz.co.uk/canvas/ 正如您将看到的,它渲染了一堆球。我遇到的问题是当应用程序首次启动时,球被 Canvas 边缘切断。他
我有两个 3d 物理 vector ,带有 (x,y,z) 和方向。我想对它们做一些操作。但我有一些问题: 我应该如何在 C++ 中表示这个 vector ?换句话说,我在下面写了类,但我不知道如何表
我有一个有 body 的 Sprite 。我想通过路径移动 Sprite 。我已经尝试使用 PathModifier 执行此操作, Sprite 会按原样移动,但它的 body 不会跟随 Sprite
我开发了类似投币推土机的游戏。为了硬币的平稳移动,我为每个硬币添加了一种物理 Material ,但这样做之后我的游戏速度非常慢。有没有其他选择,或者我如何在不使用物理 Material 的情况下使硬
我正在开发一款简单的平台游戏,例如 super 马里奥。我将 Java 与 LibGdx 引擎一起使用。我的物理问题与帧率无关。在我的游戏中,角色可以跳跃,跳跃高度显然取决于帧率。 在我的桌面上,游戏
我正在开发一个可能包含数学、物理和化学符号的问答应用程序,因为这是一个实时游戏应用程序,每次问题将从服务器下载并针对特定主题显示。它需要是一个原生的 Android 应用程序,并且性能非常重要(两人游
我的任务是编写一个对象,该对象可以接收不同类型的路径/url,并返回它是什么类型的路径/url。例如路径可以是 1. [drive]:\Temp 2. \\Temp 3. Temp (assuming
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
注意:当我提到层时,我指的是物理层。此站点上与“层”相关的许多问题都指的是逻辑层,这不是我要问的。 我正在设计一个使用标准“3 层”架构的应用程序,包括表示层、业务逻辑 (BLL) 层和数据访问层 (
如何检查设备上的屏幕或物理/电容式导航按钮 最佳答案 您可以使用 ViewConfiguration.get(context).hasPermanentMenuKey() 仅适用于 API 级别 14
我在我的 android 游戏中使用 AndEngine,我从 github 下载了主 AndEngine,但是没有主的 Physics Box2D 扩展。我不知道在哪里下载它或我可以使用它的哪个版本
我是一名优秀的程序员,十分优秀!