将Box2D Body创建与实体组件系统集成

时间:2015-07-18 04:00:49

标签: java libgdx entity components box2d

背景

我正在开发一款游戏(使用LibGDX)并且最近了解了实体组件系统。我决定使用LibGDX附带的ECS,Ashley。但是,这可能适用于将Box2D与任何实体组件系统一起使用。

问题

创建Box2D主体并附加形状相对复杂。这是一个基本的例子:

BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DynamicBody;
bodyDef.position.set(0, 0);

Body body = world.createBody(bodyDef);

CircleShape shape = new CircleShape();
shape.setRadius(1f);

FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;

body.createFixture(fixtureDef);

shape.dispose();

BodyDefs和FixtureDefs在从它们创建Bodies和Fixtures时被复制,因此它们是可重用的。我的许多游戏对象总是具有相同的形状,因此他们可以共享FixtureDef:

private static PolygonShape shape = new PolygonShape();

public static FixtureDef platformFixtureDef = new FixtureDef();
static {
    shape.setAsBox(1f, 0.2f);
    platformFixtureDef.shape = shape;
    // as a side question, in this situation, how should I dispose of the shape when the game is over/closed?
}

然而,虽然BodyDef的大多数部分对于任何特定类型的对象保持相同,但位置总是不同的。我应该如何保持BodyDef的大多数部分相同,只是改变位置?重用一个静态BodyDef,每次更改位置变量是否更好?

或者对于我想要创建的每个Body来说,创建一个新的BodyDef会更好吗?如果我每次创建一个新的BodyDef,这会影响内存使用或性能吗? (我每秒创造~10次)

1 个答案:

答案 0 :(得分:1)

在这种情况下,最好的做法是首先关注游戏逻辑,并使用优化技术的设计模式约定。一旦您对游戏的内容感到满意,您就可以使用分析工具来确定游戏的功能。 libGDX似乎有自己的tools集。关于BodyDef对象,构造非常简单。它只是将一堆基元设置为默认值。在Memorywise中,大约9(浮点数)* 4 +(布尔值,考虑JVM中的每个布尔值最大为一个字节)5 + 5(引用)* ~8(在64位上)=大约81个字节,给出或取,每{{1}对象。 BodyDef here的来源。所以不应该成为一个问题。如果限制定义对象的范围,那么在体破坏时,不应该追溯到定义的任何引用,因此它们将被标记为自动清理。

关于ECS,我不明白这是怎么回事。以下是有关ECSlibGDX ECS

的信息