一个实体上多个装置还是多个实体?

10

假设我想在屏幕上创建1000或甚至5000个静态线条。我想知道的是,将所有这些线条(装置)附加到单个物体上和将每个装置放置在其自己的物体上之间有什么区别。这两种方法之间是否存在性能差异,或者其中一种方法提供了更多功能或控制?

以下显示了两种方法之间的差异。

将每条线附加到单个物体上:

    // Create our body definition
    BodyDef groundBodyDef = new BodyDef();
    groundBodyDef.type = BodyType.StaticBody;

    // Create a body from the defintion and add it to the world
    Body groundBody = world.createBody(groundBodyDef);

    for (int i = 0; i < 1000; i++) {
        // Create our line
        EdgeShape ground = new EdgeShape();
        ground.set(x1, y1, x2, y2);
        groundBody.createFixture(ground, 0.0f);
        ground.dispose();
    }

将每条线附加到它们自己的主体上:

    // Create our body definition
    BodyDef groundBodyDef = new BodyDef();
    groundBodyDef.type = BodyType.StaticBody;

    for (int i = 0; i < 1000; i++) {
        // Create a body from the defintion and add it to the world
        Body groundBody = world.createBody(groundBodyDef);

        // Create our line
        EdgeShape ground = new EdgeShape();
        ground.set(x1, y1, x2, y2);
        groundBody.createFixture(ground, 0.0f);
        ground.dispose();
    }

这个代码示例是针对libGDX的,但我想这是一个相当基本的box2D概念,即使没有libGDX经验也可以回答。

一个可能存在的功能区别的例子是,如果所有的线都附着在一个单一的物体上,我们调用world.destroyBody(groundBody);时,它也会摧毁所有的线,但是如果每条线都附着在不同的物体上,我们只会摧毁一条线。

但即使如此,这是否会有实质性的差别呢?如果所有线都附着在一个单一的物体上,我们可以简单地调用groundBody.destroyFixture(fixture);来销毁一条单独的线。

2个回答

10

来自Box2D手册 (7.3 刚体工厂):

将多个形状附加到静态刚体比创建单个形状的多个静态刚体更快。在内部,Box2D将静态刚体的质量和质量倒数设置为零。这使得大多数算法不需要将静态刚体视为特殊情况。

确实更有效率,但是否明显取决于情况。如果您有许多只包含一个修复件的刚体,并将它们作为单个刚体的修复件,则可能会注意到性能提升,但对于大多数游戏来说可能并不明显。

我建议您使用更易于实现的方法,并仅在确实需要时才使其更具性能。


2
对于引用和关于过早优化的警告,点赞。 - noone

1

内存使用也是需要考虑的问题。

至少在Box2D的C++版本中,每个刚体占用了一定数量的内存,就像每个夹具和形状都一样。因此,将每个夹具与其自己的刚体关联将比在一个单一刚体内创建多个夹具使用更多的内存。无论哪种情况下都将使用相同数量的夹具和形状,但前者使用了更多的刚体。

为了给出内存消耗的概念,在我打印出sizeof(b2Body)的64位平台上,C++的b2Body使用了184字节的内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接