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

Integrating Box2D Body creation with an Entity-Component System

背景

我正在开发游戏(使用 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 个)

在这种情况下,最好的做法是首先关注游戏逻辑,并使用设计模式惯例而非优化技术。一旦您对游戏的功能感到满意,您就可以使用分析工具来确定游戏的性能如何。 libGDX 似乎有自己的一套 tools. As regards BodyDef objects, the construction is extremely simple. It's just a bunch of primitives being set to their defaults. Memorywise, about 9 (floats)*4 + (booleans, considering each boolean in JVM is maximum a byte)5 + 5 (references) * ~8 (on 64bit) = roughly 81 bytes, give or take, per BodyDef object. Source of BodyDef here。所以应该不是问题。如果您限制定义对象的范围,那么在主体破坏时不应该有任何引用追溯到定义,因此它们将被自动标记为清理。

关于 ECS,我看不出它如何适合问题。这是关于 ECS and libGDX ECS.

的信息