gpt4 book ai didi

java - 在 LibGDX 游戏中重用 Box2D 对象(池化)

转载 作者:行者123 更新时间:2023-12-02 06:02:09 26 4
gpt4 key购买 nike

我正在玩一款游戏,每 1-3 秒生成一个对象。该游戏对象包含一些用于渲染目的的资源和一个 Box2D 主体。问题是我不想创建数千个对象。相反,我想重用它们,重置其属性(位置、摩擦力等),而不是创建一个全新的对象。我认为最好的方法是实现这个对象的池,但我对此很担心,因为在搜索一些信息后,我发现一些开发人员报告内存泄漏,因为所有对象都是由 Box2D 内部创建的。

您认为做到这一点的最佳方法是什么?

这是我用来表示每个游戏对象的类:

public class GameObject extends Box2dGameObject {

private static final float WIDTH = 0.85f;
private static final float HEIGHT = 1;

private Animation animationDying;
private Animation animationFalling;
private Animation animationIdle;
private Animation animationJumping;
private Animation animationRunning;

private Body body;

public GameObject(Vector2 position, World world) {
super(position, world);

init();
}

private void init() {
super.init();

dimensions.set(WIDTH, HEIGHT);

/* Get assets */
animationDying = Assets.instance.pirate.animationDying;
animationFalling = Assets.instance.pirate.animationFalling;
animationIdle = Assets.instance.pirate.animationIdle;
animationJumping = Assets.instance.pirate.animationJumping;
animationRunning = Assets.instance.pirate.animationRunning;

/* Set default animation */
setAnimation(animationIdle);

body = createBox2dBody();
}

private Body createBox2dBody() {
BodyDef bodyDef = new BodyDef();
bodyDef.fixedRotation = true;
bodyDef.position.set(position);
bodyDef.type = BodyType.DynamicBody;

PolygonShape shape = new PolygonShape();
shape.setAsBox(WIDTH / 2, HEIGHT / 2);

FixtureDef fixtureDef = new FixtureDef();
fixtureDef.density = 1;
fixtureDef.friction = 1;
fixtureDef.shape = shape;

Body body = world.createBody(bodyDef);
fixture = body.createFixture(fixtureDef);

shape.dispose();

return body;
}

/* More code omitted */
}

最佳答案

这似乎是早期优化的情况,可能不会产生您正在寻找的结果。

考虑:

  1. 位于“池”中的所有对象仍然在 Box2D 内部注册为对象。会对它们进行碰撞检查吗?碰撞会有反应吗?他们的用户标签是否会指向“池”中的某个对象(用户标签通常用于引用主体的“所有者”)?
  2. 存在与某个值中的所有值相关的生命周期问题对象...您必须小心管理放入和从池中取出的每个对象的值(位置很容易,但碰撞标志等会变得更深)。这听起来很容易出错。

如果您确实每秒只创建/销毁一个对象,那么这似乎对性能/内存影响不大。如果您要创建数百个,那就是另一回事了。我编写了一个游戏,其中子弹以每秒 10-20 颗的速度生成......每个子弹都派生自一个复合基类“Entity”(我认为该类称为“Slug”)。 “Slug”类保存了 body 、 Sprite 、碰撞处理逻辑等。当它发生碰撞时或几秒钟后,它“死亡”并进入池中。将其从池中拉出会导致它重新创建主体,我不认为这是性能或内存瓶颈。

它没有重新创建可能导致更大分配或不必要的部分(例如 Sprite )。这些在实际从池中删除之前不需要回收,因为它实际上只是对共享 Sprite 表的引用。特定的“Init(...)”方法与该类相关联,以便内存分配可以与初始化分开。

当然,您的里程可能会有所不同。但我认为在构建基础设施来修复它之前,您应该看看它是否确实是一个问题(即原型(prototype))。

关于java - 在 LibGDX 游戏中重用 Box2D 对象(池化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22590518/

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