背景
我正在开发游戏(使用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,我认为这不适合这个问题。这是有关ECS和libGDX ECS的信息。