可以无限创建和删除实体吗?
Is it ok to create and delete bodies infinitely?
我不想使用 libgdx 和 box2d 制作无限横向卷轴游戏,为此我必须生成块。与以前我只处理精灵不同,我过去常常通过合并并将它们添加到 ArrayList 并使用迭代器控制它们来无限次地生成精灵而没有问题。但是现在我使用静态物体,因为我的地形和池化不能用物体完成,所以可以一直创建一个新物体并在不需要时删除它们吗?它会减慢我的游戏速度吗?如果是这样,什么是更好的方法?谢谢。
更新:
这是我当前无法使用的代码,因为池不适用于 box2d 主体。
首先,我在不同的方法上创建了 BodyDef 和 Body:
public BodyDef createDef(){
BodyDef def = new BodyDef();
def.type = BodyDef.BodyType.StaticBody;
def.fixedRotation = true;
def.position.set(6, 6);
return(def);
}
public Body createBody(){
Body body = world.createBody(createDef());
PolygonShape shape = new PolygonShape();
shape.setAsBox(1, 1);
body.createFixture(shape, 1.0f);
shape.dispose();
return(body);
}
public void createPlatform(){
Body platform = Pools.obtain(Body.class); //then use pooling
platform = createBody(); //here I set the value equal to the return value of createBody() method
bodies.add(platform);//adding platform to the ArrayList
}
我现在的新想法就是调用这个方法创建一个新的body(创建body永远不会结束,因为我想做一个无限横版的游戏)
public void createBody(){
BodyDef def = new BodyDef();
def.type = BodyDef.BodyType.StaticBody;
def.postion.set(position.x, position.y);
PolygonShape shape = new PolygonShape();
shape.setAsBox(size.x, size.y);
myBody = world.createBody(def, 1.0f);
shape.dispose();
} `//I'm still working on how to remove bodies`
是的。可以无限期地创建和删除实体。
根据您一次创建的主体数量,所涉及的分配和垃圾收集最终可能会滞后于您的游戏。
如果您的游戏最终确实滞后,您需要切换到使用池化。您可以使用 setTransform 将 box2d 实体从屏幕左侧移动到右侧。
DylanVann 已经回答了这个问题,但我只想指出该函数不是创建新的 BodyDef 和 Shape 对象,您甚至可以重用它们。
如果您过于频繁地创建和销毁形状(例如每秒 3-4 次),请保持 BodyDef 甚至 Shape 的引用。
public void createBody(){
def.type = BodyDef.BodyType.StaticBody;
def.postion.set(position.x, position.y);
shape.setAsBox(size.x, size.y);
myBody = world.createBody(def, 1.0f);
}
我不想使用 libgdx 和 box2d 制作无限横向卷轴游戏,为此我必须生成块。与以前我只处理精灵不同,我过去常常通过合并并将它们添加到 ArrayList 并使用迭代器控制它们来无限次地生成精灵而没有问题。但是现在我使用静态物体,因为我的地形和池化不能用物体完成,所以可以一直创建一个新物体并在不需要时删除它们吗?它会减慢我的游戏速度吗?如果是这样,什么是更好的方法?谢谢。
更新:
这是我当前无法使用的代码,因为池不适用于 box2d 主体。 首先,我在不同的方法上创建了 BodyDef 和 Body:
public BodyDef createDef(){
BodyDef def = new BodyDef();
def.type = BodyDef.BodyType.StaticBody;
def.fixedRotation = true;
def.position.set(6, 6);
return(def);
}
public Body createBody(){
Body body = world.createBody(createDef());
PolygonShape shape = new PolygonShape();
shape.setAsBox(1, 1);
body.createFixture(shape, 1.0f);
shape.dispose();
return(body);
}
public void createPlatform(){
Body platform = Pools.obtain(Body.class); //then use pooling
platform = createBody(); //here I set the value equal to the return value of createBody() method
bodies.add(platform);//adding platform to the ArrayList
}
我现在的新想法就是调用这个方法创建一个新的body(创建body永远不会结束,因为我想做一个无限横版的游戏)
public void createBody(){
BodyDef def = new BodyDef();
def.type = BodyDef.BodyType.StaticBody;
def.postion.set(position.x, position.y);
PolygonShape shape = new PolygonShape();
shape.setAsBox(size.x, size.y);
myBody = world.createBody(def, 1.0f);
shape.dispose();
} `//I'm still working on how to remove bodies`
是的。可以无限期地创建和删除实体。
根据您一次创建的主体数量,所涉及的分配和垃圾收集最终可能会滞后于您的游戏。
如果您的游戏最终确实滞后,您需要切换到使用池化。您可以使用 setTransform 将 box2d 实体从屏幕左侧移动到右侧。
DylanVann 已经回答了这个问题,但我只想指出该函数不是创建新的 BodyDef 和 Shape 对象,您甚至可以重用它们。
如果您过于频繁地创建和销毁形状(例如每秒 3-4 次),请保持 BodyDef 甚至 Shape 的引用。
public void createBody(){
def.type = BodyDef.BodyType.StaticBody;
def.postion.set(position.x, position.y);
shape.setAsBox(size.x, size.y);
myBody = world.createBody(def, 1.0f);
}