假设我想在屏幕上创建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);
来销毁单行,如果它们都附加到单个主体上。
答案 0 :(得分:10)
来自Box2D Manual( 7.3 Body Factory ):
将多个形状附加到静态物体比创建物体更快 几个静态物体,每个物体上有一个形状。在内部, Box2D将静态物体的质量和反质量设置为零。这个 使数学运算成功,以便大多数算法不需要处理 静态物体作为特例。
确实性能更高。它引人注目吗?取决于,如果你有很多具有一个装置的身体并且你将它们制成一个单一的身体,但可能不适用于大多数游戏。
我建议您使用更容易实现的那个,并且只在您真正需要它时才能使其更高效。
答案 1 :(得分:0)
内存使用情况也可能需要考虑。
至少在Box2D的C ++版本中,每个主体占用固定数量的内存,就像每个夹具一样,每个形状都有。因此,将每个灯具与自己的车身相关联将比在单个车身内创建多个灯具消耗更多的内存。在任何一种情况下都将使用相同数量的灯具和形状,但在前一种情况下使用更多的灯具。
为了了解内存消耗是什么,C ++ b2Body
在64位平台上使用184字节的内存,我刚刚打印出sizeof(b2Body)
的结果。