背景

我正在开发游戏(使用LibGDX),并且最近了解了有关实体组件系统的知识。我决定使用Ashley LibGDX随附的ECS。但是,这可能适用于将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和FixtureDef,因此它们可重复使用。我的许多游戏对象始终具有相同的形状,因此它们可以共享一个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集。关于BodyDef对象,其构造非常简单。只是将它们设置为默认值的一堆原语。从内存角度看,大约9(浮点数)* 4 +(布尔值,考虑到JVM中的每个布尔值最大为一个字节)5 + 5(引用)*〜8(在64位上)=大约81个字节,每个BodyDef对象赋值或取值。 BodyDef here的来源。因此,这完全不是问题。如果限制定义对象的范围,则在销毁主体时,不应有任何追溯到定义的引用,因此它们将被自动标记为清除。

关于ECS,我认为这不适合这个问题。这是有关ECSlibGDX ECS的信息。

09-11 18:41