【问题标题】:Integrating Box2D Body creation with an Entity-Component System将 Box2D 身体创建与实体组件系统集成
【发布时间】:2015-10-07 20:56:58
【问题描述】:

背景

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

【问题讨论】:

    标签: java libgdx entity components box2d


    【解决方案1】:

    在这种情况下,最好的做法是首先关注游戏逻辑,并使用设计模式约定而不是优化技术。一旦您对游戏的功能感到满意,您就可以使用分析工具来确定游戏的性能如何。 libGDX 似乎有自己的一组tools。至于BodyDef 对象,构造极其简单。只是将一堆原语设置为默认值。内存方面,大约 9(浮点数)*4 +(布尔值,考虑到 JVM 中的每个布尔值最大为一个字节)5 + 5(引用)* ~8(在 64 位上)= 大约 81 个字节,每个BodyDef 对象.来源BodyDefhere。所以应该完全没有问题。如果您限制定义对象的范围,则在主体销毁时不应有任何引用追溯到定义,因此它们将被标记为自动清理。

    关于 ECS,我看不出它如何适合这个问题。这是关于ECSlibGDX ECS 的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2014-04-09
      • 2016-11-05
      • 2016-01-23
      • 1970-01-01
      相关资源
      最近更新 更多