一个主体或多个主体上的多个固定装置?
Posted
技术标签:
【中文标题】一个主体或多个主体上的多个固定装置?【英文标题】:Multiple fixtures on one body or multiple bodies? 【发布时间】:2014-02-05 16:52:27 【问题描述】:假设我想在屏幕上创建 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);
来销毁一行。
【问题讨论】:
【参考方案1】:来自Box2D Manual(7.3 Body Factory):
将多个形状附加到静态主体比创建要快 几个静态物体,每个物体都有一个形状。在内部, Box2D 将静态物体的质量和反质量设置为零。这 使数学计算出来,这样大多数算法就不需要处理 静态体作为特例。
它确实更高效。它引人注目吗?取决于,如果您有很多带有一个固定装置的主体,并且您将它们制作为一个单一主体的固定装置,但可能不适用于大多数游戏。
我建议您使用更容易实现的那个,并且仅在您真正需要时才提高性能。
【讨论】:
+1 对于过早优化的引用和警告。【参考方案2】:内存使用也可能需要考虑。
至少在 Box2D 的 C++ 版本中,每个物体都占用固定数量的内存,就像每个夹具和每个形状一样。因此,将每个灯具与其自己的主体相关联会比在单个主体中创建多个灯具消耗更多的内存。在任何一种情况下都将使用相同数量的夹具和形状,但在前一种情况下使用更多的实体。
为了了解内存消耗是多少,C++ b2Body
在 64 位平台上使用了 184 字节的内存,我刚刚在上面打印了 sizeof(b2Body)
的结果。
【讨论】:
以上是关于一个主体或多个主体上的多个固定装置?的主要内容,如果未能解决你的问题,请参考以下文章
在一个项目中包含多个 proto 文件会导致 protobuf_AssignDescriptorsOnce() 已经有一个主体