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