gpt4 book ai didi

java - 将 Box2D 主体创建与实体组件系统集成

转载 作者:行者123 更新时间:2023-11-30 11:00:32 24 4
gpt4 key购买 nike

背景

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

最佳答案

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

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

关于java - 将 Box2D 主体创建与实体组件系统集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31487649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com