将 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.
的信息
背景
我正在开发游戏(使用 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.
的信息